await Task.Yield()
这个表达式是用于在异步方法内中断同步过程,把线程优先权交还给其它过程,相当于await Task.Run(()=>{})。
当同步过程执行到await时,就会停止这个过程,把优先权交还给调用异步方法的主过程。有时候,异步方法中的同步过程需要消耗很长的时间,使用这个表达式可以把优先权交还给主过程。
internal class Program
{
static void Main(string[] args)
{
A a = new A();
Task t = a.Dosome();
Console.WriteLine("开始主过程中的循环,当前时间为{0}", a.sw.Elapsed.TotalMilliseconds);
for (int i = 0; i < 100000000; i++)
{
}
Console.WriteLine("结束主过程中的循环,当前时间为{0}", a.sw.Elapsed.TotalMilliseconds);
Console.ReadLine();
}
}
class A
{
public Stopwatch sw = Stopwatch.StartNew();
public async Task Dosome()
{
//await Task.Yield();
//await Task.Run(()=> { });
Console.WriteLine("开始异步方法中的循环,时间为{0}", sw.Elapsed.TotalMilliseconds);
for(int i = 0;i<100000000;i++)
{
}
Console.WriteLine("结束异步方法中的循环,时间为{0}", sw.Elapsed.TotalMilliseconds);
}
}
当前程序运行的结果是:
开始异步方法中的循环,时间为0.4532
结束异步方法中的循环,时间为284.8642
开始主过程中的循环,当前时间为285.0233
结束主过程中的循环,当前时间为490.9204
去掉任一注释符号后:
开始主过程中的循环,当前时间为5.1991
开始异步方法中的循环,时间为5.4125
结束主过程中的循环,当前时间为224.6115
结束异步方法中的循环,时间为310.4565