【发布时间】:2021-01-31 10:05:42
【问题描述】:
我有 3 个线程执行不同的工作,我需要收集有关它们的日志并将其写入文本框。所以我有:
public delegate void Notify(string message);
这些线程的 3 个类中的每一个都有:
public event Data.Notify Notify;
(数据只是一个静态类,我在其中保存我的应用程序的一般信息)。 在我使用的所有这 3 个类中的方法 Work() 中:
Notify?.Invoke("message");
在消息中,我知道作业是否已启动,是否成功。在我得到的表格类中:
Data.workingThread.Notify += Thread_Notify;
Data.readingThread.Notify += Thread_Notify;
Data.writingThread.Notify += Thread_Notify;
Data.writingThread.Start();
Data.workingThread.Start();
Data.readingThread.Start();
Thread_Notify 在哪里:
private void Thread_Notify(string message)
{
tbLogs.Text += message;
}
当我运行代码时,它抛出 System.InvalidOperationException,因为我尝试访问 'tbLogs' 而不是从创建它的线程。 我为此方法和 lock(tbLogs) 尝试了 async/await,但这些对我不起作用
【问题讨论】:
-
您可以将
BeginInvoke()发送至tbLogs.AppendText(message)。或者将事件替换为 IProgress<T> 委托和Report()到 UI 线程。在这种情况下,使用任务而不是线程更简单。您多久向该控件添加一次文本?
标签: c# multithreading winforms