Тема прервана? - PullRequest
       27

Тема прервана?

0 голосов
/ 27 декабря 2010

Привет

У меня есть приложение ASP.NET, в которое я добавил веб-сервис, который содержит метод «забей и забудь». Когда этот метод выполняется, он запускает цикл (0-99999) и для каждого цикла читает XML-файл и сохраняет его в базе данных.

Проблема в том, что это действие займет пару часов и обычно заканчивается исключением прерывания потока?

Я видел, что вы можете увеличить executeTimeout и вот как:

<httpRuntime executionTimeout="604800"/>
<compilation debug="true">

Но это не поможет?

Я также пытался добавить thread.sleep в цикле. Если я установлю его на 500, он пойдет наполовину, а если я установлю <100, он просто пройдет пару 1000 циклов, прежде чем поток прервет исключение? </p>

Как я могу решить эту проблему?

Ответы [ 3 ]

8 голосов
/ 27 декабря 2010

Не запускайте цикл внутри веб-службы. Вместо этого, поместите его в консольное приложение, приложение winforms или, возможно, даже в службу Windows. Используйте веб-сервис для запуска другой программы.

Веб-сервис - это, по сути, веб-страница, и веб-страницы asp.net не предназначены для размещения долго выполняющихся процессов.

Эта статья не дает прямого ответа на ваш вопрос, но содержит фрагмент информации, относящейся к моему ответу:

http://msdn.microsoft.com/en-us/magazine/dd296718.aspx

Однако, когда продолжительность операция растет дольше, чем типичная продолжительность сеанса ASP.NET (20 минут) или требует нескольких актеров (как в моем примере найма), ASP.NET не предлагает достаточной поддержки. Вы может вспомнить, что ASP.NET рабочий процессы автоматически выключаются простаивают и периодически перерабатывают самих себя. Это приведет к большому проблемы для длительных операций, как государство проводится в рамках этих процессов будет потеряно.

и статья, во всяком случае, хорошо читается. Может предложить вам идеи.

0 голосов
/ 27 декабря 2010

У меня есть приложение ASP.NET, в которое я добавил веб-сервис, содержащий метод «забей и забудь».Когда этот метод выполняется, он запускает цикл (0-99999), и для каждого цикла он читает файл XML и сохраняет его в базе данных.

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

В любом случае, вы МОЖЕТЕ сделать следующее:

  • Поставить в очередь WorkItem для пулапоток, чтобы забрать вещи.
  • Немедленно вернитесь.

Кроме того, веб-сервисы и тому подобное не подходят для почасовых процессов.Отметьте рабочий процесс, обрабатывайте его отдельно.

0 голосов
/ 27 декабря 2010

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

...