У меня есть несколько потоков, которые записывают в форму журнала. Какой бы поток ни имел первое сообщение, он создаст форму на лету. Я использую MyForm.InvokeRequired
/ .Invoke(…)
для каждого обновления формы, однако код иногда блокируется с основным потоком в состоянии .WaitForWaitHandle .
Из того, что я понимаю - хотя это может быть совершенно не так - проблема в том, что иногда WorkerThread создает форму. Отныне .InvokeRequired
всегда будет истинным, даже если форма впоследствии обновляется из потока пользовательского интерфейса. В последнем случае поток пользовательского интерфейса может ожидать себя?
Я надеюсь, что смогу это исправить, создав форму в самом потоке пользовательского интерфейса, но я не знаю, с какого элемента управления начинать, пока 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);
}