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 await Task.Yield(); 16 Thread.Sleep(1000); 17 Console.WriteLine("Test3任务完成"); 18 } 19 static void Main(string[] args) 20 { 21 Console.WriteLine(DateTime.Now); 22 _ = Test1(); 23 Console.WriteLine(DateTime.Now); 24 Console.ReadLine(); 25 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyywjx.html