我有一个类似下面的任务类,任务只能在其依赖任务完成时才开始运行。
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;
}
我的问题是哪种方式表现更好?为什么?
答案 0 :(得分:4)
事实上,表现可能不是一个重要因素。轮询循环将使用更多的CPU资源,因为每秒一次它必须检查所有任务以查看它们是否已完成。但这只是一个非常少量的处理。尽管如此,操作系统必须安排线程每秒运行一次,这需要任务切换,这将占用其他任务可用的CPU资源。
在您的特定情况下,您说延迟1秒不是问题。但对许多人来说,这将是。事实上,它可能会在将来的某个时间用于您的应用程序。如果你不必要,为什么要加一个延迟?
WaitAll
在等待时基本上不使用CPU资源。
更重要的一点是WaitAll
代码更清晰,更容易编写,更容易证明正确,并且更难搞砸。这似乎是要走的路。