asp.net - Task.Factory.StartNew 对 ASP.Net MVC 有帮助还是有害?

标签 asp.net asp.net-mvc task threadpool

我有一个 MVC Controller 操作,需要发出多个 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);
}

我的问题是,通过启动一个新线程来完成这项工作,我是否使事情变得更好或更糟。我的目的是在发出网络请求时释放该 .Net 线程来处理其他传入请求。但在我看来,我仍然在制作一个 .Net 线程 block ,只是可能与线程池而不是原来的线程池不同,所以我真的没有更好。那么我的怀疑是否正确,上面的代码使事情变得更糟?

Task.Factory.StartNew() 的好处(如果它有效的话)...是它简化了内部工作,不必全部异步完成。但我的问题是:这样做实际上会释放一个线程来处理传入的 Web 请求,还是仍然占用线程池中相同数量的线程?

最佳答案

是的,您现在只是阻塞了另一个线程。

如果这很好,MVC 会自动将所有操作方法包装在新任务中。

要解除线程阻塞,您需要在幕后某个地方使用异步 IO。 BCL 通常提供此服务。如果盒子上显示“异步”,则通常是异步 IO。

也就是说,很少有网络应用程序存在线程不足的问题。如果需要,线程池会启动大量线程。很少有 Web 应用程序的吞吐量受到可用线程数量的限制。您真的需要处理数百个并发请求吗?您的后端服务能够处理这种负载吗?如果这些问题中的任何一个的答案是“否”,则您不需要异步。

关于asp.net - Task.Factory.StartNew 对 ASP.Net MVC 有帮助还是有害?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24361697/

相关文章:

sql-server - 如果没有行,使用 Dapper 执行存储过程不会返回列标题

c# - 如何在 msbuild 内联任务中使用 C#6 语法?

javascript - 如何更改 JavaScript 中的图像可见性?

c# - 如何将 cs 文件添加并绑定(bind)到没有 ASCX/ASPX 页面的页面?

c# - html选择(下拉)控件在asp.net中选择索引更改事件

c# - CancellationTokenSource.CancelAfter 不工作

c# - 从同步操作方法 : Task. Run 或 ConfigureAwaits(false) 调用异步方法

c# - 表单例份验证超时后重定向到页面

asp.net-mvc - 将 plupload 与 MVC3 结合使用

asp.net-mvc - ASP MVC - 多对多关系