asp.net Обработка исключений фоновых потоков - PullRequest
3 голосов
/ 17 апреля 2010

В моем веб-приложении 3.5 .net у меня есть фоновый поток, который выполняет большую работу (приложение аналогично mint.com в том, что оно выполняет много агрегирования учетных записей в фоновых потоках). Я выполняю обширную обработку исключений в потоке, выполняющем агрегацию, но всегда есть вероятность, что необработанное исключение будет сгенерировано, и все мое приложение умрет. Я прочитал несколько статей на эту тему, но все они кажутся довольно устаревшими, и ни одна из них не реализует стандартный подход. Есть ли сегодня стандартный подход к этому? Есть ли лучший способ справиться с этим в ASP.NET 4.0?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2010

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

Вы правильно делаете, обрабатывая исключения в вашей работе с потоками. Насколько я знаю, у приложения .NET нет возможности «изящно» справиться с необработанными исключениями в фоновых потоках - они будут всегда завершать процесс.

Некоторые классы .NET Framework, такие как компонент BackgroundWorker и параллельная библиотека задач в .NET 4, упрощают многопоточность и выполняют большую часть грязной работы по обработке исключений для вас. , поэтому, если вы можете использовать эти вместо , реализующие ваш собственный многопоточный код, то вам определенно следует это сделать. Но если они не могут помочь вам в определенных обстоятельствах, если вы должны использовать ThreadPool или чистый Thread, убедитесь, что не пропускаются необработанные исключения.

1 голос
/ 17 апреля 2010

Вы всегда можете поместить блок try / catch вокруг вашего рабочего потока на очень высоком уровне ... как в самом начале потока. Я предполагаю, что это то, что вы уже делаете, или что-то в этом роде. Но имейте в виду, что вы определенно не хотите превращать неизвестную ошибку в тихую неизвестную ошибку, потому что тогда ее будет намного сложнее отследить, когда что-то пойдет не так , Убедитесь, что вы регистрируете исключение в EventLog или в журнале пользовательских приложений, если хотите просто перехватить его и забыть.

Как говорит Аарона, приложение должно умереть, когда происходит что-то неожиданное. Но я не вижу проблемы в том, чтобы просто позволить фоновому потоку завершиться / умереть, а не остановить весь процесс приложения (на самом деле, я не думаю, что Аарон здесь прав, это не убьет весь процесс), я думаю ваш вопрос в основном можно перевести как «есть ли в ASP.NET что-то волшебное, что внезапно решит проблемы, о которых я даже не знаю?» и ответ на это, конечно, нет. Но ты уже знал это. :)

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