Ошибка Control.Invoke: дескриптор еще не создан - PullRequest
0 голосов
/ 31 января 2012

Я показываю форму ожидания (говорящую «Пожалуйста, подождите ...») в другом потоке, когда в некоторых формах присутствует долго выполняющийся код (например, во время загрузки данных).Я показываю форму, как это:

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 я зацикливаюсь, пока не будет создан указанный дескриптор?Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 31 января 2012

Форма, вероятно, была закрыта после проверки IsHandleCreated, но до вызова Dispose. Возможно, пользователь нажал [x] или нажал Ctrl-F4 в форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...