Каков текущий и рекомендуемый способ запустить асинхронный поток? - PullRequest
5 голосов
/ 29 марта 2011

У меня есть веб-приложение ASP.NET MVC 3 (.NET 4).

У меня есть метод действия [HttpPost], который передает некоторые данные в базу данных.

Теперь, послеэтот метод заканчивает сохраняться в хранилище, я хочу выполнить «фоновую» задачу (подумать об аудите, или отправить электронное письмо и т. д.), где мне плевать на результат (если не произойдет ошибка, в этом случае я 'я буду выполнять регистрацию).

Как / можно запустить эту задачу из моего метода действия?

[HttpPost]
[Authorize]
public ActionResult Create(MyViewModel model)
{
   if (ModelState.IsValid)
   {
      _repo.Save(model); 
      // TODO: Fire off thread
      return RedirectToRoute("Somepage", new { id = model.id });
   }
   return View(model);
}

Ответы [ 3 ]

4 голосов
/ 29 марта 2011

Новый .NET 4 способ сделать это с Task.

http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx

Task.Factory.StartNew(MyBackgroundAction);

Но для этой простой операции, в которой вы просто хотите запустить ее и не заботиться о координации задач, использовать ThreadPool так же просто.

ThreadPool.QueueUserWorkItem(MyBackgroundAction)

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

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

2 голосов
/ 29 марта 2011

Обычно не рекомендуется использовать пул потоков в ASP.Net для асинхронных задач.

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

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

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

В прошлом я использовал MSMQ для хорошего эффекта.

0 голосов
/ 29 марта 2011
// Fire off thread
var t = new System.Threading.Thread(() =>
{
   // do whatever
});
t.Start();

В «делай все, что нужно» должна быть сделана попытка / отлов, которая регистрирует любые исключения.

...