线程.睡眠x任务.延迟



方法Task.Delay和Thread.Sleep的内存消耗不同,我使用了这两种方法,结果有很大的性能差异。有人知道为什么吗?

带线程的代码

private void EncerrarWorkers()
{
foreach (BackgroundWorker worker in Workers) 
{
worker.CancelAsync();
}
//Encerra os bots
Model.BotsClose();
for (int indexRobo = 0; indexRobo < Workers.Count(); indexRobo++)
{
if (Model.IsBotClosed(indexRobo))
continue;
Thread.Sleep(5000);
indexRobo--;
}
}

带有任务的代码

private void EncerrarWorkers()
{
foreach (BackgroundWorker worker in Workers) 
{
worker.CancelAsync();
}
//Encerra os bots
Model.BotsClose();
for (int indexRobo = 0; indexRobo < Workers.Count(); indexRobo++)
{
if (Model.IsBotClosed(indexRobo))
continue;
Task.Delay(5000);
indexRobo--;
}
}

两者都包含在Windows窗体的方法中。

利用代码块的性能差异:在此处输入图像描述

他们做的事情截然不同。

CCD_ 1导致当前正在执行的线程在给定的时间内停止运行。它可能不会消耗额外的内存或进行太多处理,但在睡眠的整个时间里,它都使用系统线程,这是一个有限的资源。您可能会使应用程序缺少线程,或者导致在其他地方创建另一个线程,这会对性能产生很大影响。但是,如果只有一个线程在你的计算机上运行,那么它就很好。

Task.Delay创建一个Task,该Task将在给定的时间内处于休眠状态,然后完成。如果您在异步方法中使用,这允许您将线程返回给调用方,调用方可以将其用于其他事情,直到计时器结束。当您有多个线程时,例如在web服务器环境中或进行大量数据库读取时,这会更加高效。但是,您必须使用await,否则任务将被创建但随后被忽略,因此不会延迟任何时间。要使用await,您必须在异步堆栈中的异步方法中。您可以在任务上调用Wait(),但这仍然会锁定线程,因此此时不妨使用Sleep

看起来你有一些工作线程。最好是制作这些任务,他们在WhenAllWhenAny上使用.WaitAll来等待,直到一个任务真正完成。

最新更新