Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EventWaithandle vs while(true)线程。睡眠_C#_.net_Multithreading - Fatal编程技术网

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