(나는이 문제에 대한 해결 방법을 가지고 있지만, 그것이 내가 물린 이번이 처음이 아니다, 그래서 무슨 일을 정확히 이해하기 위해 노력하고있어.)Control.Invoke는 숨겨진 ShowDialog를
에 '갇혀'하기 내 응용 프로그램에서- , 나는
ShowDialog
형태. - 클릭하면 다른 (Gui가 아닌) 스레드에서 코드를 호출하는 버튼입니다.
- 는 비 GUI 스레드를 통해 상태 (다음
Pushed
Released
)을 다시 보내는 Control.Invoke - 형태가
Pushed
를 볼 때 - 형태가
Released
본다form.Hide()
, 그것의 외관을 변경하는 호출 단추.
경우에 따라 가끔씩은 아니지만 Gui가 아닌 스레드가 Released
을 보내려고 '멈추다'가 발생합니다. 예외는 아니지만 Gui는 '작업'을 수행하지만 비 Gui 스레드와 더 이상 통신 할 수 없습니다.
스레드에 대한 (간체) 호출 스택은 다음과 같습니다
System.Threading.WaitHandle.WaitOne()
(...)
System.Windows.Forms.Control.WaitForWaitHandle()
(...)
System.Windows.Forms.Control.Invoke()
(...)
GuiCode.OnStatusChanged()
(...)
NonGuiCode.SetStatus()
내가 Show
와 ShowDialog
을 대체하지만, 경우 문제가 사라집니다 - 흥미롭게도 - 그것은 더 좋아진다 (덜 자주 발생합니다)하지만하지 않습니다 Hide
을 Pushed
에 코드를 주석으로 처리하면 완전히 사라집니다. nobugz에
업데이트
덕분에, 나는 (나는 오직 전에 데이터베이스에서 만난 것) 교착 상태를 발견했습니다! 분명히 Control.Invoke를 Control.BeginInvoke로 대체하면이 문제가 해결됩니다 (상태 이벤트가 가끔씩 멈추지 만 이후의 모든 통신을 차단하지는 않습니다).
그래, 양식을 재활용하려고합니다. DialogResult를 설정하거나 닫는 것은 여전히 효과가 있습니다. 이제 Invoke와 BeginInvoke의 차이점을 읽어보아야합니다. – Benjol