Определить, был ли удален контроль - PullRequest
14 голосов
/ 16 декабря 2010

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

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 не может быть вызван для элемента управления до тех пор, пока не будет создан дескриптор окна.

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

Спасибо,

Раду

Ответы [ 3 ]

20 голосов
/ 16 декабря 2010
7 голосов
/ 16 декабря 2010

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

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

                      {
                                // update my control
                      }
          ));
    }
}
catch ( InvalidOperationException )
{
    // Do something meaningful if you need to.
}
0 голосов
/ 16 декабря 2010

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

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