Как я могу отладить обработчик события, если скоро произойдет другое событие? - PullRequest
0 голосов
/ 31 октября 2019

Мое приложение WinForms подключается к работающему сервису через WCF и подписывается на события из сервиса. Когда происходит событие, мое приложение запрашивает текущие данные из службы и вызывает метод с именем UpdateDisplay (), чтобы заполнить DataGridView и отобразить его. Вид сетки остается пустым, и я пытаюсь его отладить. Но если я поставлю точку останова внутри UpdateDisplay (), в следующий раз, когда событие сработает, я получу тупик, потому что первый обработчик событий еще не завершен.

Я думал, что смогу отписаться от события в верхней части моего метода и повторно подписаться на него внизу, что-то вроде этого:

private static bool m_updatingDisplay = false;
private void UpdateDisplay()
{
    // Unsubscribe from the event while the display is being updated.  This should remove the problem of deadlocks while debugging because
    // the event gets raised again.
    m_callbackHandler.DatabaseUpdatedEvent -= m_callbackHandler_DatabaseUpdatedEvent;
    DoSomethingThatTakesALongTime(); 
    m_callbackHandler.DatabaseUpdatedEvent += m_callbackHandler_DatabaseUpdatedEvent;
}

Но я все еще получаю исключение.

Я думал только о том, чтобы обработчик событий просто установил флаг, а затем таймер проверял бы флаг каждую минуту или около того, и если это правда, тогда он будет обновлять и очищать флаг. Я думаю, что это сработало бы, но я чувствую, что это обычная проблема с общепризнанным решением, и я, наверное, должен знать, что это такое. Как лучше всего справиться с этой ситуацией?

1 Ответ

0 голосов
/ 01 ноября 2019

InvalidOpeartionException - очень странное исключение, поскольку оно охватывает лот возможных вещей. Все эти очень специфичны для того, какую функцию вы вызываете и для чего ее вызываете. Документация фактически перечисляет примеры, но они на самом деле только показывают, как мало общего имеют все случаи:

  • Предполагается, что перечислители станут недействительными, если базовая коллекция была изменена. Следовательно, они выбрасывают IOE
  • Для ResourceSet это был бы случай, когда ресурс был закрыт / удален. Следовательно, IOE
  • XContainer.Add является специфическим для модификации XML и способа, которым этот класс выполняет свою работу. Следовательно, IOE
  • И пример класса пользовательского интерфейса - это то, что мы специально придумали, чтобы заставить людей правильно использовать invoke .

Так что, не сказав нам что именно делают DoSomethingThatTakesALongTime () и m_callbackHandler_DatabaseUpdatedEvent - и с какой конкретной строкой это исключение - мы не можем надеяться вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...