Asp.net
ASP.NET MVC 多執行緒
我想在我的 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 伺服器處理執行緒(這很好)並專注於在等待時向使用者顯示程式碼或虛擬進度條。