在单独的任务中 await Task.Delay() 和 Task.Delay().Wait() 之间是否存在性能差异?

Are there performance differences between await Task.Delay() and Task.Delay().Wait() in a separate Task?

我有这样的构造:

Func<object> func = () =>
{
    foreach(var x in y)
    {
        ...
        Task.Delay(100).Wait();
    }
    return null;
}
var t = new Task<object>(func);
t.Start(); // t is never awaited or waited for, the main thread does not care when it's done.
...

所以基本上我创建了一个调用 Task.Delay(100).Wait() 很多次的函数 func。我知道通常不鼓励使用 .Wait()。 但是我想知道显示的案例是否有具体的性能损失。

.Wait() 调用发生在一个单独的任务中,它完全独立于主线程,即它永远不会等待或等待。我很好奇当我这样调用 Wait() 时会发生什么,以及我机器的处理器上会发生什么。在等待的100ms中,处理器核心是否可以执行另一个线程,并returns到Task?还是我只是生成了一个繁忙的等待过程,我的 CPU 在 100 毫秒内“主动什么都不做”,从而减慢了我程序的其余部分?

与我将其设为异步函数并调用 await Task.Delay(100) 的解决方案相比,这种方法是否有任何实际缺点?这对我来说是一个选择,但如果可以合理避免的话,我宁愿不去做。

由于线程使用效率低下,存在具体的效率损失。每个线程的堆栈至少需要 ,因此为了什么都不做而创建的线程越多,为非生产目的分配的内存就越多。

如果对线程的需求超过 ThreadPool 可用性,也可能会出现具体的 性能 损失。在这种情况下,ThreadPool 变得饱和,并且新线程以保守(缓慢)的速率注入池中。因此,您创建的任务和 Start 不会立即开始,而是会进入内部队列,等待空闲线程,或者是完成了一些先前工作的线程,或者是新注入的线程。

关于您对创建繁忙等待过程的担忧,不,这不是发生的事情。休眠线程不消耗 CPU 资源。

附带说明一下,使用 Task 构造函数创建冷 Tasks 是一种仅在特殊场合使用的高级技术。创建 delegate-based tasks is through the convenient Task.Run 方法的常用方法,即 returns 热(已启动)任务。