2012-01-31 3 views
0

일부 폼 (예 : 데이터로드 중)에 장기 실행 코드가있을 때 다른 스레드에서 대기중인 폼 ("기다려주십시오 ...")을 표시합니다.Control.Invoke 오류 : 핸들이 아직 생성되지 않았습니다.

m_PopProcessingThread = New Thread(New ThreadStart(
    Sub() 
     m_PopProcessingForm = New WaitingForm(m_Message) 
     Application.Run(m_PopProcessingForm) 
    End Sub)) 
m_PopProcessingThread.Name = "Pop Processing Thread" 
m_PopProcessingThread.SetApartmentState(ApartmentState.STA) 
m_PopProcessingThread.Start() 

가 그럼 난 이렇게 숨길 :이 같은 형태로 보여

While m_PopProcessingForm Is Nothing OrElse Not m_PopProcessingForm.IsHandleCreated 
    Threading.Thread.Sleep(20) 'Wait a bit for the form to be created 
End While 
' Dispose of the pop processing form (by disposing of this form, thread is also exited) 
m_PopProcessingForm.Invoke(Sub() 
           m_PopProcessingForm.Dispose() 
          End Sub) 

이 코드는 잘 작동을하지만 난 그냥 고객의 버그 리포트를 가지고 :

Exception Type : System.InvalidOperationException 
Invoke or BeginInvoke cannot be called on a control until the window handle has been created. 
    at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle) 
    at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) 
    at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) 
    at System.Windows.Forms.Control.Invoke(Delegate method) 

스택 트레이스는 폼을 숨기는 코드 부분을 가리 킵니다. 어떻게 핸들이 생성되지 않았습니까? Invoke 호출 직전에 핸들이 생성 될 때까지 루프가 생깁니 까? 당신의 도움을 주셔서 감사합니다.

+0

이러한 용도로 설계된 BackgroundWork 및/또는 Task를 사용하십시오. –

+0

약간 거꾸로 된 것을 알고 있습니다. 대개 작업은 대기중인 양식 대신 다른 스레드에 있어야합니다. 그러나 현재 코드가 99,999 %의 시간 동안 작동한다고 생각하면 모든 코드를 변경하는 것보다 해결할 수 있습니다. –

답변

2

양식이 IsHandleCreated 검사 후 Dispose가 호출되기 전에 닫혔습니다. 사용자가 폼에서 [x]를 누르거나 Ctrl-F4를 누른 것 같습니다.

+0

놀랍습니다.이 양식에는 X 버튼이없고 양식은 오래 동안 열려 있지 않습니다. –

+0

이 버그는 Alt-F4 키를 눌러서 발생한 것 같지만, IsHandleCreated와 Invoke 명령어가 서로 따라야한다는 점에서 폼이 닫히는 것이 놀랍습니다. –

+0

사용자가 Alt-F4를 누르면 무한 루프가 발생할 수 있다는 사실을 알게되었습니다. 감사합니다! –

관련 문제