Asp.net mvc 为什么我要使用异步方法而不是非异步方法

Asp.net mvc 为什么我要使用异步方法而不是非异步方法,asp.net-mvc,asynchronous,.net-core,task-parallel-library,Asp.net Mvc,Asynchronous,.net Core,Task Parallel Library,我不明白,我看到.Net Framework提供的许多方法都有异步和非异步变体 我的问题是,在以下约束条件下,异步方法为我提供了什么优势: -我将不获取任务。在同一方法中多次获取结果 -我没有使用CPU绑定的任务。请运行 我在MVC控制器中,我想处理post请求: 在这种情况下,我将在我的方法中只使用一次结果,并且我不会多次要求它,因为等待只会给我完成的任务结果,有什么区别? 我基本上是在MethodAsync中创建状态机,用于什么? 我想我可以更快地完成非异步操作 如果我没有将该方法委托给下面

我不明白,我看到.Net Framework提供的许多方法都有异步和非异步变体

我的问题是,在以下约束条件下,异步方法为我提供了什么优势: -我将不获取任务。在同一方法中多次获取结果 -我没有使用CPU绑定的任务。请运行

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

在这种情况下,我将在我的方法中只使用一次结果,并且我不会多次要求它,因为等待只会给我完成的任务结果,有什么区别? 我基本上是在MethodAsync中创建状态机,用于什么? 我想我可以更快地完成非异步操作

如果我没有将该方法委托给下面这样的单独任务,为什么要使用异步版本? 我这样问是因为默认情况下,即使MVC控制器模板也使用异步版本提供所有CRUD操作

Task tsk=Task.Run(async()=> await MethodAsync() );
在我的场景中,这是我错过的东西吗?使用内部旋转状态机的异步版本比使用非异步版本更快吗

有什么区别

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

对于ASP.NET应用程序来说,这意味着同步操作方法会在请求期间阻塞请求线程,而异步操作方法不会阻塞该线程

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

有关更多信息,请参阅中的同步与异步请求处理部分;本文的这一部分适用于所有服务器技术,包括ASP.NET核心。您还可以通过限制线程池的增长率来查看显示可伸缩性差异的示例。我还没有将该示例移植到ASP.NETCore,但应该很简单

有什么区别

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

对于ASP.NET应用程序来说,这意味着同步操作方法会在请求期间阻塞请求线程,而异步操作方法不会阻塞该线程

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


有关更多信息,请参阅中的同步与异步请求处理部分;本文的这一部分适用于所有服务器技术,包括ASP.NET核心。您还可以通过限制线程池的增长率来查看显示可伸缩性差异的示例。我还没有将该示例移植到ASP.NET Core,但应该很简单。

正是在您有IO绑定任务时,您才不想等到磁盘、数据库或远程站点响应。MethodAsync是否正确是不可能的,因为您没有发布代码。但是等待的行为是阻止调用线程,而结果尚未计算。不,不是。原始线程被释放,可以处理其他请求。wait等待已经异步的操作,并在原始同步上下文中恢复执行。对于ASP.NET核心应用程序,异步/等待意味着更少的线程可以服务更多的请求。或者,如果您有一个高流量站点,则需要较少的服务器来处理相同的卷。请注意,等待任务。运行。。。一点帮助都没有-原始线程被释放只是为了在新线程上继续执行。在这种情况下,最好保持原始线程,避免切换。请检查。它们解释了在ASP.NET核心应用程序中可能损害可伸缩性的各种因素。正是当您有绑定IO的任务时,您才不想等到磁盘、数据库或远程站点响应。MethodAsync是否正确是不可能的,因为您没有发布代码。但是等待的行为是阻止调用线程,而结果尚未计算。不,不是。原始线程被释放,可以处理其他请求。wait等待已经异步的操作,并在原始同步上下文中恢复执行。对于ASP.NET核心应用程序,异步/等待意味着更少的线程可以服务更多的请求。或者,如果您有一个高流量站点,则需要较少的服务器来处理相同的卷。请注意,等待任务。运行。。。一点帮助都没有-原始线程被释放只是为了在新线程上继续执行。在这种情况下,最好保持原始线程,避免切换。请检查。这个
请解释可能会损害ASP.NET核心应用程序可伸缩性的各种因素;某物;某物,您不能传递给somethingElse,因此基本上您的线程会在该命令处阻塞。这不像是在另一个线程中放东西。@Bercovicadrian:如果你的异步操作方法确实在等待什么;,然后请求线程返回到线程池。稍后,当某件事情完成时,另一个请求线程被执行并继续执行异步操作方法,调用somethingElse;因此,每当我在等待时,我将无法传递到下一条指令,但到达该点的线程基本上被释放,而另一个线程将返回我的结果,并在等待前继续该方法。是的,。但是当你说等待时;某物;某物,您不能传递给somethingElse,因此基本上您的线程会在该命令处阻塞。这不像是在另一个线程中放东西。@Bercovicadrian:如果你的异步操作方法确实在等待什么;,然后请求线程返回到线程池。稍后,当某件事情完成时,另一个请求线程被执行并继续执行异步操作方法,调用somethingElse;因此,每当我等待时,我将无法传递到下一条指令,但到达该点的线程基本上被释放,而另一个线程将返回我的结果,并在等待前继续该方法。是。
Task tsk=Task.Run(async()=> await MethodAsync() );