Thread.Sleep(2500) 与 Task.Delay(2500).Wait()
Thread.Sleep(2500) vs. Task.Delay(2500).Wait()
我想澄清一下。我知道 Task.Delay
将在内部使用 Timer 并且它显然是基于任务的(可等待的),而 Thread.Sleep
将导致线程被阻塞。但是,在任务上调用 .Wait
会导致线程被阻塞吗?
如果不是,人们会认为 Task.Delay(2500).Wait()
优于 Thread.Sleep(2500)
。这与我调用的 SO question/answer here .Wait()
.
略有不同
在未完成的任务上使用 Wait
确实会阻塞线程,直到任务完成。
使用 Thread.Sleep
更清晰,因为您是显式阻塞线程而不是隐式阻塞任务。
使用 Task.Delay
的唯一方法是它允许使用 CancellationToken
,因此您可以根据需要取消阻止。
Thread.Sleep(...)
创建一个事件以在 X 毫秒内唤醒您,然后让您的线程进入睡眠状态...在 X 毫秒内,该事件将您唤醒。
Task.Delay(...).Wait()
创建一个事件以在 X 毫秒内启动任务,然后让您的线程进入睡眠状态直到任务完成(等待)...在 X 毫秒内,事件启动任务并结束立即唤醒你。
基本上,它们都非常相似。唯一不同的是,如果你想从另一个线程中早起,你不会打同样的方法。
我想澄清一下。我知道 Task.Delay
将在内部使用 Timer 并且它显然是基于任务的(可等待的),而 Thread.Sleep
将导致线程被阻塞。但是,在任务上调用 .Wait
会导致线程被阻塞吗?
如果不是,人们会认为 Task.Delay(2500).Wait()
优于 Thread.Sleep(2500)
。这与我调用的 SO question/answer here .Wait()
.
在未完成的任务上使用 Wait
确实会阻塞线程,直到任务完成。
使用 Thread.Sleep
更清晰,因为您是显式阻塞线程而不是隐式阻塞任务。
使用 Task.Delay
的唯一方法是它允许使用 CancellationToken
,因此您可以根据需要取消阻止。
Thread.Sleep(...)
创建一个事件以在 X 毫秒内唤醒您,然后让您的线程进入睡眠状态...在 X 毫秒内,该事件将您唤醒。
Task.Delay(...).Wait()
创建一个事件以在 X 毫秒内启动任务,然后让您的线程进入睡眠状态直到任务完成(等待)...在 X 毫秒内,事件启动任务并结束立即唤醒你。
基本上,它们都非常相似。唯一不同的是,如果你想从另一个线程中早起,你不会打同样的方法。