Я показываю форму ожидания (говоря «Please wait ...») в другом потоке, когда в некоторых формах есть длинный код (например, во время загрузки данных). Я показываю форму, как это:Ошибка 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 и/или задачу, которые они предназначены именно для этой цели. –
Я знаю, что это немного вверх тормашками, обычно задача должна быть в другом потоке, а не в ожидании. Но учитывая, что текущий код работает 99,999% времени, я бы скорее исправить его, чем изменить весь мой код. –