簡體   English   中英

EventWaithandle與while(true)Thread.Sleep

[英]EventWaithandle vs while(true) Thread.Sleep

我有一個類似下面的任務類,一個任務只能在其相關任務完成后才能開始運行。

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代碼更清晰,更易於編寫,更容易證明正確並且更難於解決。 好像是要走的路。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM