【发布时间】:2019-07-10 21:05:14
【问题描述】:
以下代码来自https://blog.stephencleary.com/2012/02/async-and-await.html我只是添加了一些描述性方法
class Program
{
async static Task Main(string[] args)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //thread id is 1 here
await DoSomethingAsync();
Console.WriteLine("do other workzzz");
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //thread id is 4 here
Console.ReadLine();
}
public static async Task DoSomethingAsync()
{
await Task.Delay(2000);
}
}
作者说:
我喜欢将“等待”视为“异步等待”。也就是说,async 方法会暂停,直到 awaitable 完成(所以它等待),但实际线程没有被阻塞(所以它是异步的)。
所以我的问题是:
为什么实际线程(在我的情况下是线程 id 1)没有被阻塞?
从我的角度来看,线程被阻塞是因为在当前方法完成之前不会执行进一步的语句。我们可以看到Console.WriteLine("do other workzzz");直到DoSomethingAsync()完成后才会被执行,是不是有点阻塞?
另外需要注意的重要一点是,DoSomethingAsync(); 完成后,线程 id 从 1 变为 4,不再有“实际线程”。为什么线程1消失了?不应该是线程4消失吗?
【问题讨论】:
-
@AllanS.Hansen 这不是这篇文章的真正目的
-
使用
await Task.WhenAll(taskA, taskB, …);一次等待多个任务。 -
@ckuri 我只想知道 B 部分是否可以同步调用,也就是 async/await 也可以同步运行。
-
@slowjams 阅读了blog of Stephen Cleary 以及所有关于 async/await、Tasks 等的文章——其中有很多,每一篇都值得一读。这应该回答你所有的异步/等待问题
标签: c# .net async-await