我想對此有所澄清。我知道Task.Delay
將在內部使用一個定時器,它顯然是基於任務的(等待),而Thread.Sleep
將導致線程被阻塞。但是,調用。等待任務會導致線程阻塞?Thread.Sleep(2500)與Task.Delay(2500).Wait()
如果不是,則可以認爲Task.Delay(2500).Wait()
比更好。這與SO question/answer here略有不同,因爲我打電話給.Wait()
。
我想對此有所澄清。我知道Task.Delay
將在內部使用一個定時器,它顯然是基於任務的(等待),而Thread.Sleep
將導致線程被阻塞。但是,調用。等待任務會導致線程阻塞?Thread.Sleep(2500)與Task.Delay(2500).Wait()
如果不是,則可以認爲Task.Delay(2500).Wait()
比更好。這與SO question/answer here略有不同,因爲我打電話給.Wait()
。
在未完成的任務上使用Wait
確實會阻塞該線程,直到任務完成。
使用Thread.Sleep
更明確,因爲您顯式阻止了一個線程,而不是隱式阻塞任務。
使用Task.Delay
的唯一方法是,它允許使用CancellationToken
,因此如果您願意,可以取消該塊。
...但只有當你有另一個線程運行,可以使用'CancellationToken'作爲主線程將被阻止。 –
@BradleyUffner好吧,你可以創建一個自我取消令牌(內部使用一個定時器)... – i3arnon
Thread.Sleep(...)
創建一個事件來喚醒你在X millisec,然後把你的線程睡覺......在X millisec,事件喚醒你。
Task.Delay(...).Wait()
創建一個事件在X毫秒啓動一個任務,然後把你的線程休眠,直到任務完成(有等待)......在X毫秒,事件開始並立即結束任務,然後你醒來向上。
基本上它們都很相似。唯一的區別是,如果你想從另一個線程早早醒來,你不會用同樣的方法。
爲什麼會更好? – i3arnon
是的,在'Task'上的'.Wait()'是一個阻塞調用。從你的角度來看,他們基本上是等同的。 –
由於您的2個選項提供了類似的功能,我認爲您確實需要澄清「更好」的含義。 –