我想在我的 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 的最佳实践是什么?为什么我不应该自己创建线程、后台工作者、任务等并使用线程池?如果重要的话,应用程序将托管在公共服务器上。
这似乎是使用新功能的好地方AsycController
在 ASP.NET MVC 2 中。它非常易于使用,允许您对多个独立源运行查询,而不会阻塞请求线程。
MSDN 有一个很好的例子 http://msdn.microsoft.com/en-us/library/ee728598(v=vs.100).aspx#performing_multiple_operations_in_parallel他们正在查询新闻服务、天气服务和体育服务。
您可以在原始代码中看到它们按顺序查询每个源,但在最终版本中,所有任务并行运行,并且当它们全部完成时控制权返回到控制器:
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
});
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)