C# Thread.Sleep(2500)与Task.Delay(2500).Wait()的比较

C# Thread.Sleep(2500)与Task.Delay(2500).Wait()的比较,c#,multithreading,async-await,task-parallel-library,task,C#,Multithreading,Async Await,Task Parallel Library,Task,我想澄清一下。我知道Task.Delay会在内部使用计时器,它显然是基于任务的(等待),而Thread.Sleep会导致线程被阻塞。但是,对任务调用.Wait是否会导致线程被阻塞 如果不是这样,人们会认为Task.Delay(2500).Wait()比Thread.Sleep(2500)好。这与我在未完成的任务上使用Wait调用.Wait()时调用的as确实会阻塞线程,直到任务完成 使用Thread.Sleep更清晰,因为您是显式阻塞线程,而不是隐式阻塞任务 使用Task.Delay唯一可取的方

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


如果不是这样,人们会认为
Task.Delay(2500).Wait()
Thread.Sleep(2500)
好。这与我在未完成的任务上使用
Wait

调用
.Wait()
时调用的as确实会阻塞线程,直到任务完成

使用
Thread.Sleep
更清晰,因为您是显式阻塞线程,而不是隐式阻塞任务

使用
Task.Delay
唯一可取的方法是,它允许使用
CancellationToken
,以便您可以根据需要取消块。

Thread.Sleep(…)
创建一个事件,在X毫秒内唤醒您,然后将线程置于睡眠状态。。。在X毫秒内,事件将唤醒您

Task.Delay(…).Wait()
创建一个事件以在X毫秒内启动任务,然后将线程置于睡眠状态,直到任务完成(使用Wait)。。。以X毫秒为单位,事件启动任务,任务立即结束,然后将您唤醒


基本上,它们都非常相似。唯一的区别是如果你想从另一个线程中早起,你不会使用相同的方法。

为什么会更好?是的,
任务上的
等待()
是一个阻塞调用。从您的角度来看,它们本质上是等效的。由于您的两个选项提供了类似的功能,我认为您确实需要澄清“更好”的含义……但前提是您运行的另一个线程可以使用
CancellationToken
,因为主线程将被阻塞。@BradleyUffner,您可以创建一个自取消令牌(在内部使用计时器)…Task.Delay(…).Wait()创建一个事件以在X毫秒内启动任务,然后将线程置于睡眠状态,直到任务完成“这里没有创建任务。是的,有一个,但它是空的。”。延迟返回一个任务对象。是的。任何任务都不会启动。只有一个task对象是由TaskCompletionSource创建的,其状态会在一段时间后更新。