2012-01-31 4 views
0

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

+0

Используйте BackgroundWork и/или задачу, которые они предназначены именно для этой цели. –

+0

Я знаю, что это немного вверх тормашками, обычно задача должна быть в другом потоке, а не в ожидании. Но учитывая, что текущий код работает 99,999% времени, я бы скорее исправить его, чем изменить весь мой код. –

ответ

2

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

+0

Было бы удивительно, что на этой форме нет кнопки X, и форма не остается открытой надолго. –

+0

Я полагаю, что эта ошибка могла произойти, нажав Alt-F4, но было бы очень удивительно, что форма была бы закрыта между инструкциями IsHandleCreated и Invoke, считая, что они следуют друг за другом. –

+0

Вы заставляли меня понимать, что может быть бесконечный цикл, если пользователь нажимает Alt-F4, хотя, спасибо за это! –

Смежные вопросы