Время от времени мой графический интерфейс приложений перестает перерисовываться. Там много потоков, которые запускают все виды событий (например, таймеры или сетевые данные готовы и т.д.). Также есть много элементов управления, которые подписывают эти события. Из-за этого все обработчики событий воспроизводят игру InvokeRequired/Invoke. Теперь я понял, что когда GUI замерзает много потоков, ожидание возврата Invoke(). Похоже, что сообщение перестало накачивать насос. Обработчики выглядят следующим образом:
private void MyEventHandler( object sender, EventArgs e ) {
if ( InvokeRequired ) {
Invoke( new EventHandler( MyEventHandler ), sender, e );
return;
}
SetSomeStateVariable();
Invalidate();
}
Любые идеи?
Решение: BeginInvoke(). Похоже, вы всегда должны использовать BeginInvoke(), если у вас много CrossThread-Events...
Спасибо.
Спасибо всем.
EDIT: Похоже, что BeginInvoke()
действительно решила его. Не замораживать до сих пор.