AlC*_*ode 9 c# asp.net-mvc multithreading
我有点困惑,我的ASP.NET MVC应用程序将托管在服务器上,所以有没有任何一点让它多线程?例如,如果我想要一个线程来执行我的翻译,这是个好主意吗?有人可以向我详细说明吗?我对网络应用程序多线程与桌面应用程序多线程有点混淆.
Jon*_*nna 28
这有几点要做.
首先,每个ASP.NET应用程序(MVC或其他)本质上都是多线程的:每个请求都将在一个单独的线程上处理,因此您将自动处于多线程情况,并且必须考虑对任何数据的共享访问(例如静力学等).
另一个是使用MVC,它特别容易编写异步控制器方法,如:
public async Task<ActionResult> Index(int id)
{
var model = await SomeMethodThatGetsModelAsync(id);
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我们已经是多线程的话那么为什么呢?使用更少线程的好处(具有讽刺意味的是).假设SomeMethodThatGetsModel(id)
可以阻断或以其他方式容纳线程,await
荷兰国际集团上SomeMethodThatGetsModelAsync(id)
允许当前线程以处理另一个请求.Web服务器可以处理多少请求的限制之一是它可以处理这些请求的线程数.释放线程,增加吞吐量.
另外,您可能希望在应用程序的后台进行一些操作,这里的原因与桌面应用程序相同.
简单地说,如果你有可以同时完成的工作和阻塞(例如,点击数据库和两个web服务),那么你以多线程方式这样做的原因与桌面应用程序相同.
(在最后两种情况下,要小心使用默认的静态线程池,例如通过ThreadPool.QueueUserWorkItem
或Task.Run
.因为如果你大量使用相同的线程池用于主ASP.NET线程,你就是在同一个盘子里吃作为你的框架.一些这样的用法绝对没问题,但是如果你大量使用单独的线程,那么为它们使用一组单独的线程,可能还有你自己的池化机制).