我认为我已经阅读了大约20篇关于async/await的文章,多个stackoverflow上的问题,但我对它的工作原理仍有很多疑惑,特别是在涉及到多线程和单线程使用时。
我编写了以下代码来测试一个场景:
static async Task Main(string[] args)
{
var longTask = DoSomethingLong();
for (int i = 0; i < 1000; i++)
Console.Write(".");
await longTask;
}
static async Task DoSomethingLong()
{
await Task.Delay(10);
for (int i = 0; i < 1000; i++)
Console.Write("<");
}
当我在DoSomethingLong方法中使用delay来阻塞执行时,我明确地允许我的Main继续将点写入控制台。我可以看到,当delay结束后,点和<符号的写入开始相互干扰。
我只是无法想象:是两个线程同时执行这项工作吗?一个线程写入点,另一个线程写入其他字符?还是某种方式下只有一个线程在上下文之间切换?我会说这是第一种情况,但我仍然不确定。当使用async/await时,什么时候可以期望创建一个额外的线程?这对我来说仍然不清楚。
此外,执行Mai、达到await并回来写入点的线程始终是相同的线程吗?
<
吗?从逻辑上讲(以及运行时),它们不会。 - Haytam