2015-02-08 2 views
3

Я пытаюсь создать веб-службу, которая вызывает хранимую процедуру. Эта хранимая процедура довольно длинная (около 1 часа 30 минут), и она делает множество «счетчиков» и «вставляемых» в базу данных. Для запуска этой процедуры я использовал задачу класса C#; вот пример:Запуск хранимой процедуры с помощью Task.Factory.StartNew

[HttpPost] 
[Route("updateData/{date:datetime?}")] 
public JsonResult UpdateData(DateTime? date) { 
    try { 
     Task.Factory.StartNew(() => Data.UpdateData(date), TaskCreationOptions.LongRunning); 
     return Json("UpdateData successfully started !"); 
    } 
    catch (Exception e) { 
     return Json("Error UpdateData: " + e); 
    } 
} 

Когда я тестирую в местной среде, он работает; но когда я работаю над Azure, процесс останавливается примерно через 30 минут.

Для запуска веб-службы я использую планировщик Microsoft Azure.

Проблема, похоже, не в хранимой процедуре, но она, похоже, используется в задаче (потому что без задачи она работает).

Есть ли что-то особенное?

+0

Как вы используете это внутри лазурное планировщик? Внутри приложения ASP.NET? –

+0

Я использую консоль администрирования Microsoft azure (графическая); с ним могут быть запущены пунктуальные или периодические задачи; Благодаря этому я запускаю свой веб-сервис. – Fabaud

+0

Какое приложение является веб-сервисом? Библиотека классов? –

ответ

3

То, что вы испытываете, - это тайм-аут IIS. После того, как IIS обнаруживает пассивность, it will terminate the app pool:

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

Это происходит потому, что Task.Factory.StartNew не регистрирует работу с IIS, поэтому он не знает, что у вас в настоящее время активная работа продолжается.

Чтобы избежать этого, если вы используете .NET 4.5.2, вы можете использовать HostingEnvironment.QueueBackgroundWorkItem для регистрации и работы очереди в потоке ASP.NET Threadpool.

Если вы находитесь в предыдущих версиях, вы можете использовать BackgroundTaskManager от Stephan Cleary.

Более подробную информацию, прочитать this post по команде .NET Web Development

Смежные вопросы