我不明白,我已经看到.Net Framework
提供的许多方法都具有async
和non-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>
答案 0 :(得分:3)
有什么区别?
可扩展性。具体来说,同步方法会阻塞调用线程,而异步方法则不会。
(对于ASP.NET应用程序)这意味着同步动作方法在请求持续时间内会阻塞请求线程,而异步动作方法不会阻塞该线程。
这反过来又带来了更大的可伸缩性。由于线程池是一种有限的资源(特别是由于线程注入速率有限),因此异步代码允许您的应用使用更少的线程来处理更大的负载。
有关更多信息,请参见my article on async ASP.NET中的“同步请求与异步请求处理”部分;本文的该部分适用于所有服务器技术,包括ASP.NET Core。您还可以签出this gist来证明通过限制线程池增长率来实现可伸缩性差异。我尚未将该示例移植到ASP.NET Core,但这应该很简单。