为什么我要使用异步而不是非异步方法

贝科维奇·阿德里安

我不明白,我已经看到有许多方法.Net Framework都具有asyncnon-async变体。

我的问题是,async在以下约束条件下,一种方法对我有什么好处:-我不会Task.Result在同一方法中多次提取
-我没有使用CPU-bound任务(Task.Run(...)

我在MVC控制器中,我想处理一个post请求:

 [HttPost]
 [Route(..)]
 public async Task DoSomething(MyModel model)
 {  
    var asyncResult=await NETMethodAsync(model); //PostAsync,WriteAsync....
    var nonAsyncResult= NETMethod(model); //Post,Write,....etc..
    return result;
 }

在这种情况下,我将result只在方法中使用一次,并且不会多次要求它(哪里await会给我完成的任务结果)有什么区别?我基本上是StateMachineMethodAsync为什么创建一个non-async我可以更快地进行手术

如果我未将方法委托给另一个Task(如下所示),为什么我要使用async版本?我问是因为即使MVC Controller默认情况下模板也提供CRUD使用这些async版本的所有操作

Task tsk=Task.Run(async()=> await MethodAsync() );

PS在我的情况下是我想念的东西。使用async(内部旋转状态机)然后使用非异步版本是否更快

斯蒂芬·克莱里

有什么不同?

可扩展性。具体来说,同步方法会阻止调用线程,而异步方法则不会。

这意味着(对于ASP.NET应用程序)是同步操作方法在请求期间阻止请求线程,而异步操作方法不阻止该线程。

反过来,这会产生更大的可伸缩性。由于线程池是有限的资源(特别是由于线程注入速率有限),因此异步代码允许您的应用使用更少的线程来处理更大的负载。

有关更多信息,请参见我在异步ASP.NET上的文章中的“同步请求与异步请求处理”部分本文的该部分适用于所有服务器技术,包括ASP.NET Core。您还可以通过限制线程池的增长率来检查出可扩展性差异的要点我没有将该示例移植到ASP.NET Core,但是应该很简单。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果sync.WaitGroup类型的Wait()方法阻塞了,因此不是异步的,为什么要使用它?

为什么需要使此方法异步?

为什么需要使用 await 关键字来调用异步方法

如果Task.run可以实现异步等待,为什么还要使用异步等待

为什么此代码使用异步方法?

为什么我的异步函数返回Promise {<pending>}而不是值?

为什么我的异步函数返回Promise {<pending>}而不是值?

为什么我在异步功能中使用setState而不是更新状态(Flutter)?

为什么IAuthenticationFilter的方法异步?

为什么我要使用Maybe而不是List?

如果我使用 new Task(action) -> .Start() 而不是 Task.Run() 创建它,为什么 Task 在调用任何异步方法时停止执行?

为什么我不能在异步方法中调试代码?

为什么不是 SmtpClient.SendAsync 异步?

为什么 WebRequest.GetResponseAsync() 不是异步的?

为什么“异步”不是保留字?

当IIS已经处理请求并发时,为什么要使用异步控制器?

为什么要使用异步/非阻塞框架构建API?

为什么要使用process.nextTick来确保异步任务正确执行?

为什么需要使用 promise 作为异步回调的包装器

为什么从服务器获取数据时需要使用异步?

在我的 Cypress.io 测试中,为什么我需要将 cy.task 视为异步而不是异步

为什么要使用单独的加载方法而不是构造函数?

为什么我更喜欢使用API异步功能而不是用Task.Run包装同步功能?

为什么我的异步代码没有运行异步?

如果要使用await,为什么Javascript(ES.next)会强制我将一个函数声明为异步函数?

为什么在调用异步方法的方法上需要异步?

为什么我与ContinueWith死锁异步?

为什么我们需要使用 'get_absolute_url()' 而不是自定义定义的类似方法?

为什么要使用IHttpActionResult而不是HttpResponseMessage?