2009-03-20 2 views
5

Я борется с обработкой событий в потоках фонового рабочего.Работа с фоновым рабочим событием

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

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

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

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

ответ

2

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

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

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

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

+0

Зачем вам это нужно? Потому что это работает BackgroundWorker. Намного легче справиться с ошибкой в ​​вызывающем потоке, чем в рабочем потоке. Но при отладке другой путь верен, так как вы получаете доступ ко всем локальным переменным. – Samuel

+0

Я не думаю, что «это работает BackgroundWorker» - это удовлетворительный ответ. Похоже, вы видите все исключения, указывающие на ошибки кодирования - это правда только иногда. Если бы я хотел, чтобы отладчик разбился на обработанное исключение, я включил бы исключения с первым шансом или установил точку останова. –

0

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

1

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