簡體   English   中英

啟動異步線程的當前和推薦方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM