EventWaithandle vs while(true)Thread.Sleep

时间:2014-07-14 05:20:48

标签: c# .net multithreading

我有一个类似下面的任务类,任务只能在其依赖任务完成时才开始运行。

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;
}

我的问题是哪种方式表现更好?为什么?

1 个答案:

答案 0 :(得分:4)

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

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

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

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