阅读本篇文章前需要C#多线程基础、Async函数基础、SynchronizationContext基础
默认情况
以下是测试代码:
static void Main(string[] args)
{
Test0();
Console.Read();
}
static void Test0()
{
AsyncMethod();
Console.WriteLine("after calling AsyncMethod : " + Thread.CurrentThread.ManagedThreadId);
}
static async Task AsyncMethod()
{
Console.WriteLine("before await : " + Thread.CurrentThread.ManagedThreadId);
await Task.Run(() =>
{
// 一个耗时的计算
ConsumeTime();
Console.WriteLine("Task : " + Thread.CurrentThread.ManagedThreadId);
});
Console.WriteLine("after await : " + Thread.CurrentThread.ManagedThreadId);
}
执行结果:
可以看出,await后面的代码段是由执行Task的线程来执行的。
但资料上的理论知识还表示,由于在Task执行完之前,Thread1会挂起状态机返回执行Console.WriteLine("after calling AsyncMethod : " + Thread.CurrentThread.ManagedThreadId);,等到Task结束后,由Thread3恢复状态机,执行await后的代码,这种挂起操作是有消耗的。如果Task很快就执行完了,在Thread1返回之前就已经执行好了,这种情况下,如果还将状态机挂起,就白白损耗了性能。它很聪明,Thread1检测到自己返回前Task已经执行完毕,就不会将状态机挂起,并且由自己直接完成aw