c#杂项笔记(230)

async await

同步函数执行到async时会同步执行,当在async里遇见await时,会跳出async函数到外部继续执行。
await执行完了后再执行async里面await之后的代码

async函数由于返回的是task类型,注意属性有同步类型

  1. 函数参数不能有out ref,必须返回Task
    1. 不应混合使用同步和异步代码,异步最好始终异步
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      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()
      {
      //开始延迟函数
      var delayTask = DelayAsync();
      // 等待延迟完成
      delayTask.Wait();
      }
      }
      //test方法在gui和aps.net会出现死锁,控制台不会
      //这种死锁的根本原因是 await 处理上下文的方式
      //默认情况下,当等待未完成的 Task 时,会捕获当前“上下文”,在 Task 完成时使用该上下文恢复方法的执行
      //GUI 和 ASP.NET 应用程序具有 SynchronizationContext,它每次仅允许一个代码区块运行。
      //当 await 完成时,它会尝试在捕获的上下文中执行 async 方法的剩余部分。
      //但是该上下文已含有一个线程,该线程在(同步)等待 async 方法完成。它们相互等待对方,从而导致死锁。
  1. await不像Task.Run(),它并不会创建线程来执行,只会移交权限来继续执行。

  2. 我一开始想这玩意,不创建新线程咋个优化呢。后面他们说会挂起执行其它函数,这样并发的时候就能很好处理,不会卡住。

// //