ASP.NET MVC多线程

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的最佳做法是什么?为什么我不能自己创建我的线程,后台工作者,任务,以及使用线程池?如果重要,应用程序将托管在公共服务器上.

Roh*_*ngh 7

这似乎是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)


Run*_*ess 6

是的JQuery和一些AJAX会做得最好.加载页面,然后将~15个单独的Ajax查询发送回服务器并让它们异步完成.通过这种方式,您可以让Web服务器处理线程(这很好),并专注于在等待时向用户显示自动收报机或虚拟进度条.

  • 只要工作可以通过这种方式分解,那么这是一个非常好的方法...除了避免滚动自己的线程的陷阱之外,随着用户反馈给用户提供反馈要容易得多. (2认同)
  • 这是否是一种好方法取决于您是要在服务器上还是在客户端上合并结果.存在这样的风险:您需要将大量逻辑移动到客户端,以便在服务器上更好地处理. (2认同)

Jim*_*m L 4

如果您使用 .Net 4,我什至建议您查看并行命名空间。它们使这一切变得更加简单,并且可以更好地利用所有 CPU 内核。

我还会考虑将其从您的主网络应用程序中完全卸载。使用一组单独的服务或消息队列来处理此长时间运行的请求将使您可以更轻松地扩展,并且允许您的 Web 应用程序担心服务页面请求,而不是执行长时间运行的逻辑。谷歌搜索“iis long running request”之类的内容即可开始。