【问题标题】:what's the best way to display logs from multiple threads?显示来自多个线程的日志的最佳方式是什么?
【发布时间】:2015-02-02 14:59:15
【问题描述】:

我有一个带有 datagridview 的 windows 窗体应用程序,每一行都与它自己的线程相关联。每个线程调用一个对象的不同方法,然后记录进入、退出和其他重要事件。

每当用户单击它时,我想显示与 datagridview 行对应的日志。这样所选行的消息将显示为运行状态日志。

我考虑过使用 Action 委托和多行文本框,但不确定如何根据特定的 datagridview 行过滤日志消息。

请建议我一种方法来实现这一点。任何帮助将不胜感激

编辑:日志将显示在 UI 上的文本框或其他内容中,而不是我已经做的文件中。另一件事是我希望日志不断更新。

Edit2:我已经将日志附加到行/线程的字符串成员中,当单击该行时,它将显示到目前为止保存的日志消息。但在线程中,字符串会不断更新新消息。所以我正在寻找一种方法来显示在后台线程中更新的运行日志消息。

【问题讨论】:

  • 你可以使用 Log4Net 。

标签: c# multithreading winforms datagridview


【解决方案1】:

要处理日志记录,最好的方法是重用现有的库,例如 log4net。这些可以很好地处理多线程、安全性和所有其他你现在不会想到的陷阱。

Log4netappenders 一起使用,这是将日志记录附加到一个或多个目标(文件、数据库或任何您想要的)的方法。

在您的情况下,您想要登录到 UI 组件,我认为它是不可用的开箱即用。但是你可以自己写!我认为为了实现这一点,您只需要创建一个新类来处理 UI 日志记录逻辑并相应地编辑 log4net 配置。

This thread 可能是一个好的开始!它不涵盖网格中的日志记录,而是包含在文本框中。基本上它是 UI 日志记录!你将不得不加强它!

【讨论】:

    【解决方案2】:

    如果许多线程使用同一个对象,最好锁定它,这样一来只有一个威胁会改变它。

    static object obj = new object();
                static void WriteInGrid(string message)
                { 
                    lock(obj)
                    {
                         Yourdelegate (message)
                    }
                }
    

    【讨论】:

    • 我正在寻找一种方法来使用文本框或不断更新的东西在 UI 中显示日志,唯一我无法弄清楚的是如何根据 datagridview 行显示它们(也线程)被选中。我已经将它们写入日志文件。
    • 也许你应该使用 lock 来锁定对象,这样线程就会互相等待来改变控制属性。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 2016-11-28
    • 2016-12-21
    • 1970-01-01
    • 2016-12-30
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多