在c# 5.0中,async/await"函数在开始运行时总是在主线程上运行
本文关键字:运行时 开始 函数 运行 线程 quot await async | 更新日期: 2023-09-27 18:17:35
我发现当我调用一个"async"函数时,首先,线程是主线程。当它遇到await Task时,线程将被切换到另一个线程。
static void Main(string[] args)
{
println("Mainthread ID " + Thread.CurrentThread.GetHashCode());
var s = DoSomethingAsync();
println("Waiting for DoSomethingAsync Complete ");
Thread.Sleep(2000);
println(s.Result.ToString());
}
static async Task<int> DoSomethingAsync()
{
println("DoSomethingAsync Thread ID " + Thread.CurrentThread.GetHashCode());
int val = await Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
println("Task Thread ID " + Thread.CurrentThread.GetHashCode());
return 100;
});
println("DoSomethingAsync end " + Thread.CurrentThread.GetHashCode());
return val;
}
结果如下:
11:40:34 383 Mainthread ID 1
11:40:34 398 DoSomethingAsync Thread ID 1
11:40:34 400 Waiting for DoSomethingAsync Complete
11:40:35 400 Task Thread ID 3
11:40:35 400 DoSomethingAsync end 3
11:40:36 401 100
我们可以看到主线程id是1。DoSomethingAsync线程ID也是1。它们是一样的。所以在开始运行"async"函数时,是主线程完成这部分的。
这意味着当主线程遇到"async"函数时,它将被阻塞以运行某些东西,直到它遇到await任务。"async"函数不会使事情立即异步。对吗?
我知道如果"async"函数中没有await Task,这个"async"函数将同步运行
这意味着当主线程遇到"async"函数时,它将是阻塞以运行某些东西,直到它满足等待任务。"异步"函数不会使事情立即异步。对吗?
是的,是这样的。您的async
方法将一直运行,直到击中它的第一个await
关键字,这将在此之后将控制权交还给调用者。在您的示例中,您没有对该方法执行await
,因此它将立即继续执行下一个方法。
作为旁注,控制台应用程序并没有真正的主线程,因为它使用默认的ThreadPoolSynchronizationContext
。这意味着您将在等待的async方法之后看到任意线程id。
该方法将在任何调用该方法的线程中开始运行。如果从主线程调用该方法,它将在主线程中开始运行。如果它是从线程池线程中调用的,它将在线程池线程中开始运行。在这方面,它与任何其他方法没有什么不同。
任何await
操作之后的延续都将利用当前的SyncrhonizationContext
来确定它们是如何调度的。