Обработка событий фонового рабочего - PullRequest
5 голосов
/ 20 марта 2009

Я боролся с обработкой событий в потоках backgroundworker.

Вся документация, с которой я столкнулся, заставляет меня поверить, что когда обработчик события DoWork генерирует исключение, это исключение должно обрабатываться в обработчике RunWorkerCompleted, и это исключение будет доступно в свойстве Error RunWorkerCompletedEventArgs.

Это нормально, но во время отладки я всегда вижу исключение, не обработанное сообщением с кодом пользователя. Это заставляет меня поверить, что есть проблема с моим подходом.

Какие шаги я должен предпринять, чтобы решить эту проблему?

С уважением, Джонатан

Ответы [ 3 ]

2 голосов
/ 20 марта 2009

Я видел такое поведение раньше и обошел его, украсив обработчик DoWork атрибутом System.Diagnostics.DebuggerNonUserCode:

[System.Diagnostics.DebuggerNonUserCode]
void bw_DoWork(object sender, DoWorkEventArgs e)
{ ... }

Обратите внимание, что вы увидите это, только если вы работаете в отладчике; даже без атрибута все работает так, как должно быть при запуске из оболочки.

Я снова посмотрел на это и до сих пор не вижу веских причин, почему вам нужно это сделать. Я называю это ошибкой отладчика.

1 голос
/ 20 марта 2009

У меня была эта проблема раньше. Ошибка e.Error устанавливается только тогда, когда вы не работаете в режиме отладки. Если вы запускаете в Debug, exectuion останавливается на месте исключения. Однако, запустите ту же программу в режиме Non debug (в VS Debug -> Start Without Debugging или Ctrl + F5), и диалоговое окно с неприятными исключениями не появится, и e.Error будет исключением. Не знаю почему, но вот как это работает ....

0 голосов
/ 20 марта 2009

Ваш подход правильный. Просто нажмите продолжить сообщение и продолжайте. Если есть сомнения, протестируйте его вне сеанса отладки.

...