Ily*_*gin 7 asp.net asp.net-mvc multithreading
我想在我的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
Run Code Online (Sandbox Code Playgroud)
前几天我看到一篇文章解释了为什么在asp-net应用程序中创建新的Threads是非常不推荐的,而ThreadPool是应该使用的.在这种情况下,mvc的最佳做法是什么?为什么我不能自己创建我的线程,后台工作者,任务,以及使用线程池?如果重要,应用程序将托管在公共服务器上.
这似乎是AsycController在ASP.NET MVC 2中使用新的一个非常好的地方.它非常易于使用,并允许您在不阻塞请求线程的情况下针对多个独立源运行查询.
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
});
}
Run Code Online (Sandbox Code Playgroud)
是的JQuery和一些AJAX会做得最好.加载页面,然后将~15个单独的Ajax查询发送回服务器并让它们异步完成.通过这种方式,您可以让Web服务器处理线程(这很好),并专注于在等待时向用户显示自动收报机或虚拟进度条.
如果您使用 .Net 4,我什至建议您查看并行命名空间。它们使这一切变得更加简单,并且可以更好地利用所有 CPU 内核。
我还会考虑将其从您的主网络应用程序中完全卸载。使用一组单独的服务或消息队列来处理此长时间运行的请求将使您可以更轻松地扩展,并且允许您的 Web 应用程序担心服务页面请求,而不是执行长时间运行的逻辑。谷歌搜索“iis long running request”之类的内容即可开始。
| 归档时间: |
|
| 查看次数: |
10526 次 |
| 最近记录: |