|
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
|
|||
---|---|---|---|
#18+
Описываю ситуацию. Есть кнопка на форме, которая, запускает задачу. Задача что-то обсчитывает, не важно что. После запуска задачи открывается окошко-прогрессбар. По ходу обсчета, задача кидает событие что-то типа "определенный этап обсчета завершен". Окошко-прогрессбар подписано на это событие и перерисовывает прогрессбар каждый раз. Вроде понятно.(?). По ходу обсчета, есесно, могут возникать исключительные ситуации. Так вот я хочу перехватывать исключения не в задаче, а в основном потоке. Погуглил. Советуют делать через ContinueWith. Работает, но мне не совсем нравится такой подход, потому что нет возможности использовать try-catch , приходится использовать if-else , что не радует. Может кто-то предложит лучший подход. А пока я делаю вот так. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2015, 11:59 |
|
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
|
|||
---|---|---|---|
#18+
Тут описана работа с асинхронными операциями с помощью ContinueWith, в том числе описана обработка ошибок. Если хочется try...catch, то есть смысл вместо ContinueWith использовать async/await. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2015, 12:07 |
|
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
|
|||
---|---|---|---|
#18+
Алексей К, спс, почитаю, вроде вы уже кидали мне эту ссыль давно по другому вопросу. ограничен четверным .нетом ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2015, 13:03 |
|
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
|
|||
---|---|---|---|
#18+
Попутно вопрос: зачем разные типы исключений обрабатывать по разному? В большинстве случаев исключение: 1. Прерывает цепочку операций, синхронных или асинхронных, не важно. 2. Несёт в себе информацию об ошибке и месте её возникновения (stack trace) для записи в системный журнал (вывода message box на экран). Специальные процедуры для обработки исключений разных типов требуются достаточно редко. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2015, 13:56 |
|
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
|
|||
---|---|---|---|
#18+
Алексей К, В зависимости от типа исключения хочу в messagebox показывать разные осмысленные сообщения, а не свойство Message из исключения. Ну вот просто надо и все :) Чот пока не понял как вашу статью применить на свой случай... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2015, 14:34 |
|
Как лучше всего перехватывать исключения, выбрасываемые в параллельном потоке
|
|||
---|---|---|---|
#18+
monstrillaАлексей К, В зависимости от типа исключения хочу в messagebox показывать разные осмысленные сообщения, а не свойство Message из исключения. Ну вот просто надо и все :) Чот пока не понял как вашу статью применить на свой случай...Именно про преобразование исключения в статье не написано, это отдельная задача, напрямую не относящаяся к асинхронному выполнению. Для преобразования исключения не вижу принципиальной разницы, использовать if или catch , если преобразовывать в одном обработчике исключений, централизованно. Но можно преобразовывать и в месте возникновения, внутри асинхронной операции: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2015, 17:39 |
|
|
start [/forum/topic.php?fid=21&msg=38887259&tid=1440919]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 386ms |
0 / 0 |