Asp.net mvc 如果不使用';你不能把它升级到控制器吗?

Asp.net mvc 如果不使用';你不能把它升级到控制器吗?,asp.net-mvc,async-await,Asp.net Mvc,Async Await,我正试图弄明白如何在我的Asp.NETMVC中使用C#中的async/await。 主要的一点似乎是,它有助于asp.net在执行IO时从工作线程池中释放线程(以便它们可以处理其他内容)。为此,您必须将async/await修饰符从执行IO调用的方法提升到控制器操作(您最好只有几个层) 在不将异步/等待升级到我的控制器的情况下使用此功能有什么意义吗?(例如,在调用异步方法后添加Task.Wait)。答案是“是”,但在操作中使用Task.Wait()不是一个好主意,因为它可能导致死锁情况 通过以下

我正试图弄明白如何在我的Asp.NETMVC中使用C#中的async/await。 主要的一点似乎是,它有助于asp.net在执行IO时从工作线程池中释放线程(以便它们可以处理其他内容)。为此,您必须将async/await修饰符从执行IO调用的方法提升到控制器操作(您最好只有几个层)

在不将异步/等待升级到我的控制器的情况下使用此功能有什么意义吗?(例如,在调用异步方法后添加Task.Wait)。

答案是“是”,但在操作中使用
Task.Wait()
不是一个好主意,因为它可能导致死锁情况

通过以下方式考虑指南中的以下内容:

图3异步代码阻塞时常见的死锁问题

public static class DeadlockDemo
{
   private static async Task DelayAsync()
   {
      await Task.Delay(1000);
   }
   // This method causes a deadlock when called in a GUI or ASP.NET context.
   public static void Test()
   {
       // Start the delay.
       var delayTask = DelayAsync();
       // Wait for the delay to complete.
       delayTask.Wait();
   }
}
但是,如果将
ConfigureAwait(false)
添加到
DelayAsync()
中,如下所示:

await Task.Delay(1000).ConfigureAwait(false)
然后可以避免死锁,如本文所述:

除了性能之外,
ConfigureAwait
还有另一个重要方面:它可以避免死锁。再次考虑<强>图3 < /强>;如果在
DelayAsync
中的代码行中添加“
ConfigureAwait(false)
”,则可以避免死锁。这一次,当wait完成时,它将尝试在线程池上下文中执行异步方法的其余部分。该方法能够完成,从而完成其返回的任务,并且没有死锁。如果需要逐渐将应用程序从同步转换为异步,则此技术特别有用


不要使用Task.Wait,因为它可能会死锁或产生AggregateException。如果您需要这样做,那么您应该使用非阻塞

一般来说,端到端使用异步代码是最安全的。在整个堆栈中使用异步的好处是,代码将更容易调试,错误处理也更简单


因此,,如果要使用async/await,请将其包含在控制器中,并避免使用诸如Task.Wait之类的阻塞代码。

如果您也基本上手动执行主机系统对异步代码所做的相同操作,即在等待时执行其他任务,则这可能是有益的。这可能相当复杂,但可行。异步并没有什么神奇之处,它主要是一种允许顶级消费代码做其他事情的方式,而底层基础结构代码则等待完成某些事情。主机系统在顶层支持它,但您的代码也可以。然而,如果你只是简单地“模糊”同步操作背后的异步操作,那么你基本上否定了它的好处。如果我理解得很好,我的问题的答案是“你必须推广它”,对吗?因为死锁问题绝对是:)