gpt4 book ai didi

c# - EventWaithandle 与 while(true) Thread.Sleep

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:07 25 4
gpt4 key购买 nike

我有一个如下所示的任务类,一个任务只有在其依赖任务完成后才能开始运行。

class MyTask
{
List<MyTask> dependentTasks;
public TaskStatus Status;
public EventWaitHandle CompletedEvent;
public void Run() { }
}

我有两种方法可以实现,一种是像这样使用 EventWaitHandle:

EventWaitHandle.WaitAll(dependentTasks.Select<MyTask, EventWaitHandle>
(t => t.CompletedEvent).ToArray());

另一种方法是使用 while 循环并检查依赖任务列表中的状态:

while (true)
{
//Here I'm not sensitive on time, so delay 1 second is acceptable.
Thread.Sleep(1000);
if (dependentTasks.TrueForAll(t => t.Status == TaskStatus.Completed))
break;
}

我的问题是哪种方式的性能更好,为什么?

最佳答案

事实上,性能在这里可能不是一个重要因素。轮询循环使用更多的 CPU 资源,因为它必须每秒检查一次所有任务以查看它们是否已完成。但这是非常少量的处理。不过,操作系统必须安排线程每秒运行一次,这需要任务切换,这会占用其他任务可用的 CPU 资源。

在您的特定情况下,您说延迟 1 秒不是问题。但对很多人来说,它会是。事实上,它可能会在将来某个时候用于您的应用程序。如果不需要,为什么要添加延迟?

WaitAll 在等待时基本上不使用 CPU 资源。

更重要的一点是WaitAll代码更清晰,更容易编写,更容易证明正确,也更难搞砸。似乎那是要走的路。

关于c# - EventWaithandle 与 while(true) Thread.Sleep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24729955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com