Обнаруживать, было ли установлено управление

В моем приложении у меня есть пользовательский элемент управления, который выполняет асинхронные операции с использованием пула потоков. Метод пула потоков выглядит так:

private void AsyncFunction(object state)
    {
        ... do the calculation
        //refresh the grid data on the UI thread
        this.BeginInvoke(new MethodInvoker(() =>
                                               {
                          ... update the ui 
                                               }));
    }

Моя проблема в том, что если пользователь закрывает диалог... пользовательский элемент управления удаляется, и я получаю исключение:

Invoke или BeginInvoke нельзя вызвать в элементе управления до тех пор, пока дескриптор окна не будет создан.

Знаете ли вы способ обнаружения диалога? Я не хочу использовать свойство управления, которое устанавливается при закрытии диалогового окна. Есть ли другой способ решить это?

Спасибо,

Раду

Ответы

Ответ 2

Вы можете использовать свойство Control.IsDisposed.

try
{
    if(!this.IsDisposed) 
    {
        this.BeginInvoke(new MethodInvoker(() =>

                      {
                                // update my control
                      }
          ));
    }
}
catch ( InvalidOperationException )
{
    // Do something meaningful if you need to.
}

Ответ 3

Вы можете попробовать использовать объект синхронизации, например EventWaitHandle, чтобы сигнализировать рабочий поток, который главный поток собирается завершить. Тогда рабочий поток может завершить его выполнение.