Ваша проблема в том, что ваш поток пользовательского интерфейса ВСЕГДА занят.Я говорю это, предполагая, что количество элементов в logQueue
довольно велико.Цикл while не завершается, пока очередь не опустеет.Так что он продолжает попадать в поток пользовательского интерфейса с запросом обновлений.
Также if (txtLog.InvokeRequired)
отчасти бессмысленно, потому что вы всегда вызываете метод из рабочего потока.
Итак, так как a.Приложение net WinForm имеет только один пользовательский интерфейс, который в вашем случае слишком занят для обработки других уведомлений, новое окно выглядит застрявшим (поскольку сообщения рисования застряли в очереди сообщений и не могут быть обработаны, так как они уже заполнены текстовым полемобновить сообщения)
Вы можете вставить Application.DoEvents
в ваш цикл, что даст циклу сообщений некоторое время для обработки ожидающих уведомлений.Однако, на мой взгляд, это своего рода хак, поскольку поведение пользовательского интерфейса иногда непредсказуемо.Это может привести к таким вещам, как заикание при перемещении диалога, задержка ответов на события щелчка и т. Д.
Другой пункт, MessageBox.Show
или Form.ShowDialog
(если вы используете это для кнопки отмены),блокирующий вызов.Нить, на которой вы показываете это, будет висеть, пока вы не закроете диалог.Попробуйте Form.Show
и установите для родительского свойства основную форму.
Другой альтернативой является добавление таймера и обработка только X уведомлений в течение Y секунд.Это даст потоку пользовательского интерфейса некоторое пространство для выполнения других действий.