C# 如果更改了其中一个控制器方法,是否应该将每个控制器方法都更改为异步的?

C# 如果更改了其中一个控制器方法,是否应该将每个控制器方法都更改为异步的?,c#,.net,asp.net-mvc,asynchronous,async-await,C#,.net,Asp.net Mvc,Asynchronous,Async Await,有一个控制器文件SecretAuthController.cs public class SecretAuthController : Controller { public ActionResult Auth() { //library method whose signature recently changed to async return ProcessTelemetr

有一个控制器文件SecretAuthController.cs

    public class SecretAuthController : Controller 
    {
          public ActionResult Auth()
          {
               //library method whose signature recently changed to async

              return ProcessTelemetry();
          }        
    }
因此,我的同事将此代码更改为

        public class SecretAuthController : MyBaseController
        {
              public Async Task<ActionResult> Auth()
              {
                   //library method whose signature recently changed to async                  
                   await MyLib.GetTaskDetails(Id);
                   return ProcessTelemetry();
              }        
        }
对此几乎没有疑问:

  • 如果没有等待的调用,是否明智地将方法签名更改为使用
    async
  • 如果要将一个动作方法签名更改为使用
    async
    ,是否需要更改所有动作方法签名,这是一条一般规则?(假设他们不等待)

  • 只有当函数中有可等待的/异步功能时,才需要使其异步。无需或无需将所有操作更改为异步

    如果没有等待的调用,那么更改方法是否明智 使用异步的签名

    不,你不应该。我认为Visual Studio甚至给了您一个提示:

    此异步方法缺少“await”运算符,将同步运行

    async
    的引入使得处理I/O、DB和其他高延迟操作变得更加容易。这并不意味着它应该一直使用。它仍然会产生一些开销,如果在不需要的时候使用,它更有可能给您带来负面的性能影响。只有在实际等待某件事情时才使用
    async
    。当你这样做的时候,你应该一直这样做

    现在我们讨论
    控制器
    ,它通常是应用程序的入口点。但让我们从更广阔的角度来看待这一情况。如果有一个存储库被其他几个类使用,但由于某些原因无法使用
    wait
    ,该怎么办。如果该存储库使它的所有方法
    都是异步的
    ,那么它只会导致所有其他类在等待操作时锁定线程

    相反,您应该考虑使用
    async
    可以获得什么。消费者能等待它吗?它会提高性能吗?如果始终是
    async
    ,则是。否则,可能不会

    进一步阅读:

         public Async Task<ActionResult> ExFooTest()
         {
               //There is no awaitable call here
               //normally returns.
         }