C # Winforms Threading: вызывается закрытая форма

Следующий код демонстрирует мою дилемму. Код создает фоновый поток, который что-то обрабатывает, затем вызывает поток пользовательского интерфейса с результатом.

Он может вызвать исключение, если фоновый поток вызывает 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, но это звучит не очень элегантно. Есть ли более простой способ?

5
задан tshepang 12 January 2014 в 23:59
поделиться