在一个单独的Task中,Wait Task.Delay()和Task.Dalay().Wet()之间是否存在性能差异



我有一个这样的构造:

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.
...

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

.Wait()调用发生在一个单独的Task中,该Task完全独立于主线程,即从不等待或等待。我很好奇当我以这种方式调用Wait()时会发生什么,以及我的机器处理器上会发生什么。在等待的100毫秒内,处理器核心是否可以执行另一个线程,并在时间过去后返回Task?或者我只是产生了一个繁忙的等待过程;积极地什么都不做";持续100毫秒,从而减慢我程序的其余部分?

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

由于线程的低效使用,导致了具体的效率损失。每个线程的堆栈至少需要1MB,因此创建的线程越多而不执行任何操作,分配给非生产性目的的内存就越多。

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

关于你对创建繁忙等待程序的担忧,不,这不是事实。睡眠线程不消耗CPU资源。

附带说明一下,使用Task构造函数创建冷Task是一种高级技术,仅在特殊情况下使用。创建基于委托的任务的常见方法是通过方便的Task.Run方法,该方法返回热门(已启动(任务。

最新更新