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

时间:2019-02-22 11:15:06

标签: asp.net-mvc asynchronous .net-core task-parallel-library

我不明白,我已经看到.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只会给我完整的任务结果)有什么区别? 我基本上是在StateMachine中创建一个MethodAsync来做什么? 我想我可以更快地进行non-async操作。

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

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

PS 在我的情况下,我错过了一些事情。使用async(内部旋转状态机)是否更快,然后使用非异步版本?< / p>

1 个答案:

答案 0 :(得分:3)

  

有什么区别?

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

(对于ASP.NET应用程序)这意味着同步动作方法在请求持续时间内会阻塞请求线程,而异步动作方法不会阻塞该线程。

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

有关更多信息,请参见my article on async ASP.NET中的“同步请求与异步请求处理”部分;本文的该部分适用于所有服务器技术,包括ASP.NET Core。您还可以签出this gist来证明通过限制线程池增长率来实现可伸缩性差异。我尚未将该示例移植到ASP.NET Core,但这应该很简单。