2017-06-15 97 views
0

我很難得到我的頭。等待延遲或使用計時器

我需要執行一些方法,每個方法都會延遲一段時間。因此,從我可以讀取的內容來看,我可以使用Task.Delay或Timer,因爲它看起來在內部,Task.Delay正在使用Timer。

那麼以下兩種方法是否相等?如果不是,每種方法的優缺點是什麼?

每種方法的調用線程會發生什麼?我真的不想阻止線程。我不認爲這兩種方法中的任何一種都可以。

1的方法

public async Task SimulateScenarioAsync() 
{ 
    await Task.Delay(1000).ConfigureAwait(false); 
    await FooAsync.ConfigureAwait(false); 

    await Task.Delay(2000).ConfigureAwait(false); 
    await BarAsync.ConfigureAwait(false); 

    await Task.Delay(500).ConfigureAwait(false); 
    await StuffAsync.ConfigureAwait(false); 
} 

第二個方法

public void SimulateScenario() 
{ 
    var timer = new Timer(new TimerCallback(FooAsync), null, 1000, Timeout.Infinite); 
} 

public void FooAsync(Object obj) 
{ 
    // do some stuff 
    var timer = new Timer(new TimerCallback(BarAsync), null, 2000, Timeout.Infinite); 
} 

public void BarAsync(Object obj) 
{ 
    // do some stuff 
    var timer = new Timer(new TimerCallback(StuffAsync), null, 500, Timeout.Infinite); 
} 

public void StuffAsync(Object obj) 
{ 
    // do some stuff 
} 
+2

如果您已經使用TPL,我會選擇'Task.Delay()' –

+0

是的,延遲方法也使用它。 – dyesdyes

+0

您的第一種方法假定任務按照順序執行,並在兩者之間延遲。一般來說,使用定時器將允許任務完全獨立執行。從你的問題中不清楚你的任務之間是否存在隱式依賴關係,但是如果你有可能應該使用第一種方法。如果任務的執行時間不平凡,您還必須考慮是否應該考慮縮短延遲的時間。定時器可以更好地處理這個問題。 –

回答

1

我認爲第一種方法更具可讀性。

除此之外,我看不出選擇任何方法的任何理由。如果您在兩次操作之間等待1秒,那麼命令的性能無關緊要,因爲它肯定會比等待時間快至少1000倍。

0

This問題表明它包裹在一個呼叫這樣

async Task MyTaskWithDelay() 
{ 
    await Task.Delay(1000); 
    MyTask(); 
} 

有限公司mparing兩種方法

This回答說

主要有兩大區別:

  1. Task.Delay辦法將推遲週期之間在指定的時間量,而DispatcherTimer方法將啓動指定循環時間的新週期。
  2. Task.Delay更具可移植性,因爲它不依賴於綁定到特定UI的類型。

而且this發帖稱

的Task.Delay會阻塞線程在指定的時間。 DispatcherTimer爲計時器創建一個單獨的線程,然後在指定的時間後返回到原始線程。

+0

這是一個好的開始,但我想解釋一下爲什麼比另一個更好。線程會發生什麼 – dyesdyes