C#中关于Task.Yeild()的探究
在与同事讨论async/await内部实现的时候,突然想到Task.Yeild()这个函数,为什么呢,了解一点C#async/await内部机制的都知道,在await一个异步任务(函数)的时候,它会先判断该Task是否已经完成,如果已经完成,则继续执行下去,不会返回到调用方,原因是尽量避免线程切换,因为await后面部分的代码很可能是另一个不同的线程执行,而Task.Yeild()则可以强制回到调用方,或者说主动让出执行权,给其他Task执行的机会,可以把Task理解为协程,Task.Yeild()和Thread.sleep(0)有点相同。 为了证明我的结论成立,请看代码: 1 public static async Task Test1() 2 { 3 await Task.CompletedTask; 4 Thread.Sleep( 1000 ); 5 Console.WriteLine( " Test1任务完成 " ); 6 } 7 public static async Task Test2() 8 { 9 await Task.Delay( 1 ); 10 Thread.Sleep( 1000 ); 11 Console.WriteLine( " Test2任务完成 " ); 12 } 13 public static async Task Test3() 14 { 15