C# EventWaithandle vs while(true)线程。睡眠
我有一个任务类,如下所示,一个任务只有在其依赖任务完成后才能开始运行C# EventWaithandle vs while(true)线程。睡眠,c#,.net,multithreading,C#,.net,Multithreading,我有一个任务类,如下所示,一个任务只有在其依赖任务完成后才能开始运行 class MyTask { List<MyTask> dependentTasks; public TaskStatus Status; public EventWaitHandle CompletedEvent; public void Run() { } } 我的问题是哪种方式的性能更好,为什么呢?事实上,性能可能不是一个重要因素。轮询循环将使用更多的CPU资源,因为它必须每
class MyTask
{
List<MyTask> dependentTasks;
public TaskStatus Status;
public EventWaitHandle CompletedEvent;
public void Run() { }
}
我的问题是哪种方式的性能更好,为什么呢?事实上,性能可能不是一个重要因素。轮询循环将使用更多的CPU资源,因为它必须每秒检查一次所有任务,以查看它们是否已完成。但这是一个非常小的处理量。不过,操作系统必须安排线程每秒运行一次,这需要任务切换,这将占用其他任务可用的CPU资源 在您的特定情况下,您说1秒钟的延迟不是问题。但对很多人来说,这是一个很好的选择。事实上,它可能在将来的某个时候用于您的应用程序。如果没有必要,为什么要增加延迟
WaitAll
在等待时基本上不使用CPU资源
更重要的一点是,
WaitAll
代码更清晰、更容易编写、更容易证明正确、更难出错。这似乎是一条路。事实是,性能可能不是一个重要因素。轮询循环将使用更多的CPU资源,因为它必须每秒检查一次所有任务,以查看它们是否已完成。但这是一个非常小的处理量。不过,操作系统必须安排线程每秒运行一次,这需要任务切换,这将占用其他任务可用的CPU资源
在您的特定情况下,您说1秒钟的延迟不是问题。但对很多人来说,这是一个很好的选择。事实上,它可能在将来的某个时候用于您的应用程序。如果没有必要,为什么要增加延迟
WaitAll
在等待时基本上不使用CPU资源
更重要的一点是,
WaitAll
代码更清晰、更容易编写、更容易证明正确、更难出错。看起来这是最好的选择。当你点比萨饼时,你是每分钟起来检查一次门,直到比萨饼店的伙计到达那里,还是等他按响你的门铃然后去开门?这两种方法中哪一种更好?为什么?@ScottChamberlain:awesome man…@ScottChamberlain才华横溢,说得好。此外,OP可能想看看和@ScottChamberlain的可怕比喻。gelivableAlso,请注意,每分钟检查一次门的烦扰和浪费,加上一个事实,即平均而言,你的比萨饼会凉30秒。我喜欢热的比萨饼!当你点比萨饼的时候,你是每分钟起来检查一次门,直到那个比萨饼店老板到了,还是等他按响你的门铃然后去开门?这两种方法中哪一种更好?为什么?@ScottChamberlain:awesome man…@ScottChamberlain才华横溢,说得好。此外,OP可能想看看和@ScottChamberlain的可怕比喻。gelivableAlso,请注意,每分钟检查一次门的烦扰和浪费,加上一个事实,即平均而言,你的比萨饼会凉30秒。我喜欢热的比萨饼!睡眠的代价确实比每秒轮询一次要大。对于大多数软件来说,这可能不是什么大问题,因为您不会有其他线程,但是如果您开始在线程池或IO完成线程中调用Thread.Sleep(),那么您就会开始遇到问题,您的应用程序的其他部分将无法正常工作。Thread.Sleep的成本确实高于每秒轮询一次。对于大多数软件来说,这可能不是什么大问题,因为您不会有其他线程,但是如果您开始在线程池或IO完成线程中调用Thread.Sleep(),那么您就会开始遇到问题,您的应用程序的其他部分将无法使用。
EventWaitHandle.WaitAll(dependentTasks.Select<MyTask, EventWaitHandle>
(t => t.CompletedEvent).ToArray());
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;
}