[英]What's the Current and Recommended Way to Fire Off an Asynchronous Thread?
我有一個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)
您希望避免為每個操作自己創建一個新線程 - 它會占用更多資源並且不必要地浪費。
如果您的后台任務運行時間較長,您可能需要設置生產者/消費者隊列,並擁有一組或一組持續運行的后台線程來運行任務。
在ASP.Net中使用線程池進行異步任務通常是不明智的 。
請注意, 這里提到了這個問題,雖然我不同意答案。 接受的答案假設您需要現在完成的工作,此時可以輕松地完成此問題所描述的異步任務。 這允許處理在更長的時間段內分布,在負載不均勻時很有用(像大多數網頁一樣)。
每個請求的產生線程也不是最理想的,因為沒有簡單的方法來限制創建的線程數。 100個產生的任務將與您的Web應用程序競爭,試圖進行“實時”工作。
使用消息傳遞系統來管理不需要立即運行的異步任務。 每個處理請求都作為一個消息發送,該消息排隊等待稍后處理。 然后,您可以在本地系統上擁有單獨的應用程序,或者如果這些任務在其他計算機上進行大量處理。 通過在同一隊列中拉出的多台計算機上運行處理器,您也可以輕松地分散這些任務的負載。
在過去,我使用MSMQ效果很好。
// Fire off thread
var t = new System.Threading.Thread(() =>
{
// do whatever
});
t.Start();
在“做任何事情”你應該嘗試/捕獲記錄任何異常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.