Asp.net

ASP.NET MVC 多執行緒

  • November 1, 2016

我想在我的 asp-net-mvc 應用程序中實現這樣的邏輯:

user clicks a button->

server executes some time-consuming logic in ~15 threads (i get data from really slow independent sources)->

when all work is done, server merges the results and passes it back to user

前幾天我看到一篇文章解釋了為什麼強烈不建議在 asp-net 應用程序中創建新執行緒,而應該使用 ThreadPool。在這種情況下,mvc 的最佳實踐是什麼?為什麼我不應該自己創建執行緒、後台工作程序、任務等並使用執行緒池?如果重要,應用程序將託管在公共伺服器上。

這似乎是使用 ASP.NET MVC 2 中的新功能的好地方AsycController。它非常易於使用,並且允許您對多個獨立源執行查詢,而不會阻塞請求執行緒。

MSDN 有一個很好的例子,他們查詢新聞服務、天氣服務和體育服務。

您可以在原始程式碼中看到它們按順序查詢每個源,但在最終版本中,所有任務並行執行,並在全部完成後將控制權返回給控制器:

public void IndexAsync(string city)
{
   AsyncManager.OutstandingOperations.Increment(3);

   NewsService newsService = new NewsService();
   newsService.GetHeadlinesCompleted += (sender, e) =>
   {
       AsyncManager.Parameters["headlines"] = e.Value;
       AsyncManager.OutstandingOperations.Decrement();
   };
   newsService.GetHeadlinesAsync();

   SportsService sportsService = new SportsService();
   sportsService.GetScoresCompleted += (sender, e) =>
   {
       AsyncManager.Parameters["scores"] = e.Value;
       AsyncManager.OutstandingOperations.Decrement();
   };
   sportsService.GetScoresAsync();

   WeatherService weatherService = new WeatherService();
   weatherService.GetForecastCompleted += (sender, e) =>
   {
       AsyncManager.Parameters["forecast"] = e.Value;
       AsyncManager.OutstandingOperations.Decrement();
   };
   weatherService.GetForecastAsync();
}

public ActionResult IndexCompleted(string[] headlines, string[] scores, string[] forecast)
{
   return View("Common", new PortalViewModel  {
       NewsHeadlines = headlines,
       SportsScores = scores,
       Weather = forecast
   });
}

是的,JQuery 和一些 AJAX 會做得最好。載入頁面,然後將大約 15 個單獨的 Ajax 查詢發送回伺服器並讓它們非同步完成。通過這種方式,您可以讓 Web 伺服器處理執行緒(這很好)並專注於在等待時向使用者顯示程式碼或虛擬進度條。

引用自:https://stackoverflow.com/questions/3794741