从我的logger类到From1中的richTextBox的文本

本文关键字:richTextBox 文本 中的 From1 我的 logger 类到 | 更新日期: 2023-09-27 18:29:31

这只是一个测试,看看我的游戏管理器程序是如何工作的,这就是为什么我希望文本在我的richTextBox中。

我想把日志中的所有新行打印到我的richTextBox中,但我还没有找到一个好的方法。

我现在的做法是每1秒打印一次日志中的最后一个日志条目,所以我错过了很多日志行。

如何打印日志中的所有行,而不仅仅是最后一个日志条目。

Form1

计时器设置为1秒。

private void timerRun_Tick(object sender, EventArgs e)
{
    richTextBox1.Text += Environment.NewLine + MyLogger.GetLastLog();         
}

MyLogger

public static class MyLogger
{
    private static List<string> log = new List<string>();
    public static event EventHandler LogAdded;
    public static void Log(string message)
    {
        log.Add(message);
        if (LogAdded != null)
            LogAdded(null, EventArgs.Empty);
    }
    public static string GetLastLog()
    {
        if (log.Count > 0)
            return log[log.Count - 1];
        else
            return null;
    }        
}

有人有这样的想法或例子吗?

从我的logger类到From1中的richTextBox的文本

使用此订阅MyLogger类中定义的LogAdded事件

MyLogger.LogAdded += (s, e) =>
{
    this.Invoke((MethodInvoker) (() =>
    {
        richTextBox1.Text += Environment.NewLine + MyLogger.GetLastLog();
    }));
};

提高效果的几点建议

  1. 尝试在MyLogger类中自定义事件处理程序,使其反映新添加的日志。因此,您可以直接从事件参数中获取新添加的日志。此更改后,无需调用GetLastLog()

  2. LogAdded += (s, e) => {}添加到MyLogger类的静态构造函数中。在该改变之后,不需要检查CCD_ 7事件的可为空性。

  3. 您可以从不同的线程访问CCD_ 8。MyLogger不是线程安全的,请设置同步机制(例如使用Lock)或使用在System.Collection.Concurrent中定义的数据结构(这些都是线程安全的)