【发布时间】:2015-03-30 20:56:54
【问题描述】:
我最近看到了一些建议,指出永远不要在生产代码中使用Thread.Sleep(最近是在this SO question)。其中许多人提倡使用Task.Delay。我发现的大多数解释都使用 UI 应用程序作为示例,因为 Task.Delay 的优势是显而易见的(不会阻塞 UI)。
在我的例子中,我在一个等待循环中使用 Thread.Sleep 来轮询 WCF 服务的特定条件,如下所示:
DateTime end = DateTime.UtcNow + TimeSpan.FromMinutes(2);
while (DateTime.UtcNow < end)
{
if (ExternalServiceIsReady() == true)
{
return true;
}
Thread.Sleep(1000);
}
在这种情况下,Task.Delay 的以下潜在优势似乎并不适用:
- 相对于 15 毫秒左右的典型计时器分辨率而言,睡眠时间相当长,因此
Task.Delay的准确性提高似乎微不足道。 - 进程是单线程的(非UI),必须阻塞直到条件为真,所以在这里使用
await没有优势。 - 不需要取消延迟的能力。
这种情况适合使用Thread.Sleep吗?用Task.Delay(1000).Wait() 替换我的睡眠线有什么好处(如果有的话)?
【问题讨论】:
-
ExternalServiceIsReady是做什么的?也许可以完全避免睡眠/延迟。 -
是否有使用事件的选项 C?它可能比这种投票方式更合适。
-
选项 D 是更好的解决方案,一个计时器。
-
@HansPassant 你能详细说明为什么定时器是一个更好的解决方案吗?
-
无循环、无线程、无睡眠。
标签: c# .net async-await task-parallel-library thread-sleep