2010-11-05 2 views
2

Я использую эту функцию с помощью пользователя Stack Overflow для обновления элементов управления с BackgroundWorker.InvalidAsynchronousStateException в функции, которая проверяет, требуется ли invoke для управления

static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action) 
{ 
    // If the invoke is not required, then invoke here and get out. 
    if (!sync.InvokeRequired) 
    { 
     // Execute action. 
     action(); 

     // Get out. 
     return; 
    } 

    // Marshal to the required thread. 
    sync.Invoke(action, new object[] { }); 
} 

Эта функция отлично работает до сих пор. Я только что получил это исключение:

InvalidAsynchronousStateException

Что это значит и как я могу предотвратить это?

+0

См. Https://stackoverflow.com/a/38411886 – SMUsamaShah

ответ

2

Проблема в том, что поток, к которому объект ISynchronizeInvoke был привязан, больше не существует. Это может произойти, например, если вы создаете фоновый поток, а поток пользовательского интерфейса завершается до завершения фоновой задачи. Этот поток больше не существует, поэтому вам нечего вызывать, и вы получаете исключение.

Нет никакого хорошего способа предотвратить это. Лучший способ действий - обернуть вызов Invoke в try/catch, который обрабатывает это исключение.

+0

Использование [SynchronizationContext] (https://stackoverflow.com/a/38411886) может быть лучшей альтернативой. – SMUsamaShah

Смежные вопросы