(У меня есть обходной путь для этой проблемы, но это не первый раз, когда я был укушен, поэтому я пытаюсь понять, что происходит.)
- Из моего приложения я
ShowDialog
форма. - В форме есть кнопка, которая при нажатии на код вызывает другой (не-Gui) поток.
- Нить без GUI отправляет состояния статуса (
Pushed
thenReleased
) через Control.Invoke - Когда форма видит
Pushed
, она вызываетform.Hide()
- Когда форма видит
Released
, она меняет внешний вид кнопки.
Случается, что иногда, но не каждый раз, поток не-Gui "застревает", пытаясь отправить Released
. Никаких исключений, Gui продолжает "работать", но никакое дальнейшее общение с нитью Gui не возможно в любом направлении.
Столбец (упрощенный) для потока выглядит следующим образом:
System.Threading.WaitHandle.WaitOne()
(...)
System.Windows.Forms.Control.WaitForWaitHandle()
(...)
System.Windows.Forms.Control.Invoke()
(...)
GuiCode.OnStatusChanged()
(...)
NonGuiCode.SetStatus()
Проблема исчезает, если я заменяю ShowDialog
на Show
, но - интересно - он становится лучше (случается реже), но не полностью исчезает, если я прокомментирую код, который делает Hide
on Pushed
.
Обновление
Благодаря nobugz я обнаружил тупик (раньше я только встречался в базах данных)! По-видимому, замена Control.Invoke на Control.BeginInvoke решает эту проблему (событие состояния по-прежнему иногда "застревает", но не блокирует все последующие сообщения).