【发布时间】:2020-10-27 00:23:02
【问题描述】:
我是 C# 和异步编程的新手,如果我的问题听起来很愚蠢,我很抱歉。 假设我们有以下代码:
static void Main()
{
SomeMethod();
Console.WriteLine("Main program almost finishes");
Console.ReadLine();
}
static async void SomeMethod()
{
await Task.Delay(4000);
Console.WriteLine("Asnc code finished");
}
我对@987654324@的理解,这个工作单元在线程池中排队等待一个工作线程去执行,所以延迟发生在工作线程(这个工作线程睡眠4s)和一次4s过去了,那么这个工作线程继续执行下面的语句Console.WriteLine("Asnc code finished");,我的理解对吗?
【问题讨论】:
-
There is no thread 主要是从 I/O 的上下文中编写的,但重点仍然存在。 没有要求我们拥有一个线程来纯粹阻塞它。
-
@Damien_The_Unbeliever 听起来如果是 IO 绑定操作则没有线程,但如果我将
await Task.Delay(4000);更改为Task.Run()运行 CPU 绑定操作,例如对前 10000 个整数求和, CPU 可能需要 5s 来执行它,那么工作线程应该启动吗? -
如果您使用
Task.Run而不是 您 要求工作线程运行一些代码。无论您是否使用await,都是如此。请注意,await会按照它所说的去做——它会等待。它绝不负责创建任务或分配线程。 -
顺便说一句
async void应该只用于异步事件处理程序。它不能等待。您的应用程序将在计时器有机会触发之前终止