Thread.Sleep(2500)vs. Task.Delay(2500).Wait()

时间:2015-12-02 20:29:05

标签: c# multithreading async-await task-parallel-library task

我想要澄清一下。我知道Task.Delay将在内部使用Timer,它显然是基于任务的(等待),而Thread.Sleep将导致线程被阻塞。但是,在任务上调用.Wait会导致线程被阻塞吗?

如果没有,可以假设Task.Delay(2500).Wait()优于Thread.Sleep(2500)。这与SO question/answer here稍有不同,因为我正在调用.Wait()

2 个答案:

答案 0 :(得分:11)

在未完成的任务上使用Wait确实会阻止该线程,直到任务完成。

使用Thread.Sleep更清楚,因为您明确地阻止了一个线程而不是隐式阻塞任务。

使用Task.Delay的唯一方法是允许使用CancellationToken,因此您可以根据需要取消阻止。

答案 1 :(得分:5)

Thread.Sleep(...)创建一个事件以在X millisec中唤醒你,然后让你的线程处于睡眠状态......在X毫秒中,事件会唤醒你。

Task.Delay(...).Wait()创建一个事件以在X millisec中启动一个任务,然后让你的线程进入睡眠状态,直到任务完成(等待)...在X毫秒中,事件启动任务,立即结束然后叫醒你。

基本上,它们都非常相似。唯一的区别是如果你想早点从另一个Thread中醒来,你就不会用同样的方法。