方法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
。
看起来你有一些工作线程。最好是制作这些任务,他们在WhenAll
或WhenAny
上使用.WaitAll
来等待,直到一个任务真正完成。