加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

Task.Factory.StartNew在ASP.Net MVC中有帮助或有害吗?

发布时间:2020-12-16 07:13:01 所属栏目:asp.Net 来源:网络整理
导读:我有一个MVC控制器动作,需要发出几个Web请求.因此,为了尝试释放此线程来处理其他传入的Web请求,我写了这样的东西: (注意:这是对实际代码的过度简化) public async TaskViewResult Index(){ MyObj o = await Task.Factory.StartNewMyObj(() = { WebClient c
我有一个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);
}

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

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

解决方法

是的,你现在只是阻止一个不同的线程.

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

要取消阻止线程,您需要在封面下的某个地方使用异步IO. BCL通常提供这个.如果它在框上显示“async”,它通常是异步IO.

也就是说,很少有网络应用程序存在线程耗尽的问题.如有必要,线程池会启动大量线程.根据可用线程数量,很少有Web应用程序的吞吐量受限.你真的需要处理100个并发请求吗?您的后端服务甚至可以处理此负载吗?如果这些问题中的任何一个被“否”回答,则不需要异步.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读