use*_*657 5 asp.net asp.net-mvc task threadpool
我有一个MVC控制器动作,需要发出几个Web请求.因此,为了尝试释放这个线程来处理其他传入的Web请求,我写了这样的东西:( 注意:这是对实际代码的过度简化)
public async Task<ViewResult> Index()
{
MyObj o = await Task.Factory.StartNew<MyObj>(() =>
{
WebClient c = new WebClient();
var res1 = c.DownloadString("...");
var res2 = c.DownloadString("..."); //Not shown but res1 required for this call.
return new MyObj(res1, res2);
}
return View(o);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,通过启动新线程来完成这项工作,我做得更好或更糟.我的目的是释放这个.Net线程来处理网络请求时的其他传入请求.但看了之后,在我看来,我仍然在制作一个.Net线程块,可能与线程池而不是原始块不同,所以我真的没有好转.那么我的怀疑是否正确以及上述代码使事情变得更糟?
如果它工作,Task.Factory.StartNew()的好处是它简化了必须完成所有异步的内部工作.我的问题是:这样做是否实际上释放了一个线程来处理传入的Web请求,或者它仍然从线程池中占用相同数量的线程?
是的,您现在只是阻塞了另一个线程。
如果这很好,MVC 会自动将所有操作方法包装到一个新任务中。
要解除线程阻塞,您需要在幕后某个地方使用异步 IO。BCL 通常提供此服务。如果盒子上写着“异步”,则通常是异步 IO。
也就是说,很少有网络应用程序存在线程不足的问题。如果需要,线程池会启动大量线程。很少有 Web 应用程序的吞吐量受到可用线程数量的限制。您真的需要处理数百个并发请求吗?您的后端服务能够处理这种负载吗?如果这些问题中的任何一个的答案是“否”,则您不需要异步。
| 归档时间: |
|
| 查看次数: |
2216 次 |
| 最近记录: |