【发布时间】:2018-05-17 08:56:52
【问题描述】:
我有多个线程写入日志表单。无论线程有第一条消息,都会即时创建表单。我对每个表单更新使用MyForm.InvokeRequired / .Invoke(…),但是代码有时会在状态 .WaitForWaitHandle 中与主线程死锁。
据我了解-尽管可能完全不正确-但问题是有时 WorkerThread 会创建表单。此后,.InvokeRequired 将始终为真,即使随后从 UI 线程更新了表单。在后一种情况下,UI 线程可能正在等待自己?
我希望我可以通过在 UI 线程本身上创建表单来解决此问题,但我不知道在 MyForm==null 时从哪个控件开始。
注意:后台有一个多线程 API,其中包含用于接收/发送/处理消息的线程,我需要对其进行跟踪。
简化示例:
public static LogForm MyForm;
public static void AddLogLine(string inText) // is called from multiple threads
{
if (MyForm == null) MyForm = new LogForm();
if (MyForm.InvokeRequired)
MyForm.Invoke(new Action<LogForm, string>(_appendText), MyForm ,inText); // deadlock, UI thread state: .WaitForWaitHandle
else
_appendText(MyForm ,inText);
}
【问题讨论】:
-
这甚至不是线程安全的,您最终可能会得到 2 个或更多表单并丢失数据。
-
MyForm.InvokeRequired毫无意义且错误。 -
你为什么首先使用多个线程?你在解决什么问题?
-
因为你有一个静态字段。这不是自动线程安全的。
-
并尽可能减少静态问题。它们很容易开始,然后就会咬人。
标签: c# multithreading winforms thread-safety