2015-11-15 3 views
1

net experts.asp.net mvc, IIS, потоки и т. Д.

Существует вопрос, что я и мои коллеги не могут найти ответ, который удовлетворит всех нас.

На веб-сайте, который всегда имеет большую нагрузку, нам нужно выполнить несколько длительных задач асинхронно (обработка изображений, построение кеша, ...). Первоначальная реализация использовала объект Thread для каждого такого запроса. Я думал, что использование может быть излишним, и это также может произойти в ситуации, когда больше нитей не может быть создано. Я использовал подход «Task.Run» для всех таких запросов, которые за сценой используют ThreadPool.

Мне сказали, что это плохо, потому что IIS Application Pool использует сам по себе ThreadPool, и может возникнуть ситуация, когда эти фоновые задачи блокируются для обслуживания обычного HTTP-запроса, что также верно.

Какой подход лучше всего использовать здесь: Threads или Task?

Я знаю, что лучше всего извлечь все это в службу Windows и какую-то очередь, но на данный момент мы не можем этого сделать.

Любое другое мнение приветствуется.

спасибо.

+1

Перемещение любых длинных вещей из ASP.NET для разделения службы Windows или роли работника Azure, и вы сэкономите массу усилий. –

ответ

1

Простые потоки фона - лучший способ для долгосрочных задач в среде ASP.NET.

System.Threading.ThreadStart threadStart = delegate { SomeJob(someData); }; 
System.Threading.Thread thread = new System.Threading.Thread(threadStart); 
thread.IsBackground = true; 
thread.Start(); 

Если вы предпочитаете использовать его воплощен в Task, вы можете реализовать свой собственный TaskScheduler каких очередей задач с использованием фоновых потоков вместо использования ThreadPool, см пример на MSDN - https://msdn.microsoft.com/en-us/library/ee789351.

Для длительных задач, инициированных внутри HTTP-обработчика, существует также возможность использовать асинхронные обработчики HTTP, см. Пример здесь - https://msdn.microsoft.com/en-us/library/ms227433.