일부 폼 (예 : 데이터로드 중)에 장기 실행 코드가있을 때 다른 스레드에서 대기중인 폼 ("기다려주십시오 ...")을 표시합니다.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
호출 직전에 핸들이 생성 될 때까지 루프가 생깁니 까? 당신의 도움을 주셔서 감사합니다.
이러한 용도로 설계된 BackgroundWork 및/또는 Task를 사용하십시오. –
약간 거꾸로 된 것을 알고 있습니다. 대개 작업은 대기중인 양식 대신 다른 스레드에 있어야합니다. 그러나 현재 코드가 99,999 %의 시간 동안 작동한다고 생각하면 모든 코드를 변경하는 것보다 해결할 수 있습니다. –