Следующий код демонстрирует мою дилемму. Код создает фоновый поток, который что-то обрабатывает, затем вызывает поток пользовательского интерфейса с результатом.
Он может вызвать исключение, если фоновый поток вызывает Invoke в форме после закрытия формы. Он проверяет IsHandleCreated перед вызовом Invoke, но форма может закрыться после проверки.
void MyMethod()
{
// Define background thread
Action action = new Action(
() =>
{
// Process something
var data = BackgroundProcess();
// Try to ensure the form still exists and hope
// that doesn't change before Invoke is called
if (!IsHandleCreated)
return;
// Send data to UI thread for processing
Invoke(new MethodInvoker(
() =>
{
UpdateUI(data);
}));
});
// Queue background thread for execution
action.BeginInvoke();
}
Одним из решений может быть синхронизация FormClosing и каждого вызова Invoke, но это звучит не очень элегантно. Есть ли более простой способ?