Почему поток прерывается в ASP.NET MVC (снова)? - PullRequest
0 голосов
/ 28 апреля 2010

Вот что я делаю в действии контроллера:

  1. создать и запустить новый поток, который выполняет относительно длинную задачу обработки (в среднем ~ 30 секунд, но может занять несколько минут)
  2. немедленно возвращает ответ страницы, чтобы пользователь знал, что обработка началась (тривиально, Json с идентификатором задачи для опроса).

В какой-то случайной точке выдается исключение ThreadAbortException, поэтому асинхронная задача не завершается. Исключение не выдается каждый раз, оно происходит случайным образом примерно в 25% случаев.

Примечания:

  • Я не вызываю Response.End или Response.Redirect - даже запрос не запускается при возникновении исключения
  • Я пытался использовать ThreadPool, и у меня такое же поведение
  • Я знаю, что запуск потоков в ASP.NET имеет несколько предостережений, но сейчас мне все равно

Есть предложения?

Ответы [ 4 ]

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

Проблема в том, что вы не должны делать это таким образом. Если вам нужно, чтобы задача выполнялась в течение длительного периода времени в фоновом режиме, ASP.Net должен либо запустить процесс для ее обработки, либо добавить рабочий элемент в очередь для обработки службы Windows.

0 голосов
/ 29 апреля 2010

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

Я чувствую себя глупым.

0 голосов
/ 29 апреля 2010

Как насчет использования Асинхронного контроллера?

0 голосов
/ 28 апреля 2010

Помогает ли это, поскольку вы хотите выстрелить и забыть.

"Delegates provide a method called BeginInvoke that allows us to call the delegate asychronously."

http://hackingon.net/post/Asynchronous-fire-and-forget-method-calls-in-NET.aspx

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