Обнаруживать, было ли установлено управление
В моем приложении у меня есть пользовательский элемент управления, который выполняет асинхронные операции с использованием пула потоков. Метод пула потоков выглядит так:
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, чтобы сигнализировать рабочий поток, который главный поток собирается завершить. Тогда рабочий поток может завершить его выполнение.