2015-12-02 227 views
4

我想對此有所澄清。我知道Task.Delay將在內部使用一個定時器,它顯然是基於任務的(等待),而Thread.Sleep將導致線程被阻塞。但是,調用。等待任務會導致線程阻塞?Thread.Sleep(2500)與Task.Delay(2500).Wait()

如果不是,則可以認爲Task.Delay(2500).Wait()比更好。這與SO question/answer here略有不同,因爲我打電話給.Wait()

+0

爲什麼會更好? – i3arnon

+1

是的,在'Task'上的'.Wait()'是一個阻塞調用。從你的角度來看,他們基本上是等同的。 –

+0

由於您的2個選項提供了類似的功能,我認爲您確實需要澄清「更好」的含義。 –

回答

9

在未完成的任務上使用Wait確實會阻塞該線程,直到任務完成。

使用Thread.Sleep更明確,因爲您顯式阻止了一個線程,而不是隱式阻塞任務。

使用Task.Delay的唯一方法是,它允許使用CancellationToken,因此如果您願意,可以取消該塊。

+0

...但只有當你有另一個線程運行,可以使用'CancellationToken'作爲主線程將被阻止。 –

+2

@BradleyUffner好吧,你可以創建一個自我取消令牌(內部使用一個定時器)... – i3arnon

5

Thread.Sleep(...)創建一個事件來喚醒你在X millisec,然後把你的線程睡覺......在X millisec,事件喚醒你。

Task.Delay(...).Wait()創建一個事件在X毫秒啓動一個任務,然後把你的線程休眠,直到任務完成(有等待)......在X毫秒,事件開始並立即結束任務,然後你醒來向上。

基本上它們都很相似。唯一的區別是,如果你想從另一個線程早早醒來,你不會用同樣的方法。

+0

「Task.Delay(...)。Wait()創建一個事件在X millisec中啓動一個Task,然後把你的Thread在任務完成之前休眠「這裏沒有創建任務。 – Voo

+1

是的,有一個,但它是空的。延遲返回一個Task對象。 –

+1

是嚴重製定。沒有任何任務*開始*。只有一個由TaskCompletionSource創建的任務對象,其狀態在一段時間後會更新。 – Voo

相關問題