ASP.NET MVC多线程,值得吗?

时间:2015-05-08 11:49:46

标签: c# asp.net-mvc multithreading

我有点困惑,我的ASP.NET MVC应用程序将托管在服务器上,所以有没有什么意义使它成为多线程?例如,如果我想要一个线程来执行我的翻译,这是个好主意吗?有人可以向我详细说明吗?我对网络应用程序多线程与桌面应用程序多线程有点混淆。

2 个答案:

答案 0 :(得分:28)

有一些事情要做。

首先,每个ASP.NET应用程序(MVC或其他)本质上都是多线程的:每个请求都将在一个单独的线程上处理,因此您将自动处于多线程情况,并且必须考虑使用任何共享访问数据(例如静力学等)。

另一个是,使用MVC,它特别容易编写异步控制器方法,如:

public async Task<ActionResult> Index(int id)
{
  var model = await SomeMethodThatGetsModelAsync(id);
  return View(model);
}

现在,如果我们已经是多线程的话那么为什么呢?使用更少线程的好处(具有讽刺意味的是)。假设SomeMethodThatGetsModel(id)可能阻塞或以其他方式阻塞线程,await SomeMethodThatGetsModelAsync(id)允许当前线程处理另一个请求。 Web服务器可以处理多少请求的限制之一是它可以处理这些请求的线程数。释放线程并提高吞吐量。

另外一点是你可能希望在整个应用程序的后台进行一些操作,这里的原因与桌面应用程序相同。

简单地说,如果你有可以同时完成的工作和阻塞(例如,点击数据库和两个web服务),那么你以多线程方式这样做的原因与桌面应用程序相同。

(在最后两种情况下,要小心使用默认的静态线程池,例如通过ThreadPool.QueueUserWorkItemTask.Run。因为这个相同的线程池用于主ASP.NET线程如果你重击它,你就会从你的框架中吃同样的盘子。一些这样的用途绝对没问题,但是如果你大量使用单独的线程,那么就可以使用一组单独的线程,也许你自己汇集机制)。

答案 1 :(得分:1)

  

是否有必要使其成为多线程?

这不会起作用。问题是:您的应用程序是否需要多线程?例如,如果您收到一个大型实体集合,需要在进一步操作之前以某种方式对其进行预处理,您可以在单独的线程中处理它们而不是循环。

  

我对网络应用程序多线程与桌面应用程序多线程有点混淆

asp.net和桌面中的多线程是一样的,并且工作方式相同。