我有一个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)
您想要避免自己为每个操作创建一个新线程-它会占用更多资源,并且不必要地浪费。
如果后台任务的运行时间更长,则可能需要设置生产者/消费者队列,并使用一个或一组数量的不断运行的后台线程来运行任务。