(У меня есть обходной путь для этой проблемы, но это не первый раз, когда я был укушен, поэтому я пытаюсь понять, что происходит.)
- Из моего приложения я
ShowDialogформа. - В форме есть кнопка, которая при нажатии на код вызывает другой (не-Gui) поток.
- Нить без GUI отправляет состояния статуса (
PushedthenReleased) через 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 решает эту проблему (событие состояния по-прежнему иногда "застревает", но не блокирует все последующие сообщения).