c# – 启动异步线程的当前和推荐方法是什么?

我有一个ASP.NET MVC 3(.NET 4)Web应用程序.

我有一个[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);
}

解决方法:

新的.NET 4方法是使用Task.

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

Task.Factory.StartNew(MyBackgroundAction);

但是对于这种简单的操作,你只想运行它而不关心协调任务,使用ThreadPool也同样容易.

ThreadPool.QueueUserWorkItem(MyBackgroundAction)

您希望避免为每个操作自己创建一个新线程 – 它会占用更多资源并且不必要地浪费.

如果您的后台任务运行时间较长,您可能需要设置生产者/消费者队列,并拥有一组或一组持续运行的后台线程来运行任务.

上一篇:java – 如何向线程池的旧线程提供当前的vaadin会话?


下一篇:java – 什么时候在ThreadPoolExecutor中指定单独的核心和最大池大小是一个好主意?