一个async函数,相当于封装了普通函数,代码等价于AsyncFuncInternal***。它的启动方式,仅仅由前面是不是加了await决定。不使用await关键字,等价于 AsyncFuncInternalCallWithoutAwait。使用await,则等价于AsyncFuncInternalCallWithAwait 。
async Task AsyncFunc()
{
actualTask();
}
Task AsyncFuncInternalCallWithAwait()
{
Task t = new Task(actualTask);
t.Start();
return t;
}
Task AsyncFuncInternalCallWithoutAwait()
{
Task t = new Task(actualTask);
t. RunSynchronously ();
return t;
}
void actualTask()
{
Console.WriteLine($"ThreadID={Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(3000);
Console.WriteLine("After sleep 2000");
}
AsyncFun虽然返回了一个Task,但你没机会决定如何启动这个Task。除非再包装一层。因为内层实质上已经确定了启动方式为同步。
Console.WriteLine($"ThreadID={Thread.CurrentThread.ManagedThreadId}");
Task t = Task.Run(AsyncToSync);
Console.WriteLine("Next statement of caller");
Task AsyncToSync()
{
return AsyncFunc();
}
进一步等价于
Task AsyncToSync()
{
Task t = new Task(actualTask);
t. RunSynchronously ();
return t;
}