【发布时间】:2021-08-28 20:29:32
【问题描述】:
以应用程序调用 DoThis() 函数的简单示例为例:
public Task DoThis()
{
DoThisSub(); //Why is this being run?
Task.Delay(100); //Yet..... Why is this ignored?
Console.WriteLine("This is run immediately without delay");
return Task.CompletedTask;
}
public Task DoThisSub()
{
Console.WriteLine("Yes I am being run!");
return Task.CompletedTask;
}
为什么调用 DoThisSub 而不是调用 Task.Delay?
【问题讨论】:
-
你怎么会被忽略?
-
await基本上意味着“等待任务完成”。不使用await意味着您无需等待任务完成。Task.Delay被忽略是什么意思?你怎么知道它被忽略了?你期望会发生什么?Task.Delay(100)给你一个持续 100 毫秒的任务,但你没有等待它。 -
首先,
Task.Delay不会被忽略。您正在做的是说启动一个 100 毫秒计时器。它返回一个任务,您可以await或使用它来确定它是否已完成。但是你忽略它,所以,计时器开始,它最终会结束,但你不在乎。这就是调用任务而不等待它或做任何其他事情所做的事情,它只是启动它并忘记它。它经常被称为fire and forget -
它不一定在单独的线程上运行。不要忘记
Task != Thread。操作系统很可能能够发出计时器结束的信号,而无需专门为其分配线程。如果您从端口异步读取,则不涉及线程。当您在 EF 查询的结果上调用ToListAsync时,它会从数据库中异步读取,但不会专门为工作分配线程。 Windows 中的很多东西都是自然异步的 -
您可能会发现这些很有趣:Task vs Thread differences 和 There is no thread。
标签: c# .net async-await