我正在研究新的TPL,以使我的自制工作流程更好。
现在,我进入了Task.Delay和Thread.Sleep的迷宫。实际上,Task.Delay(50).Wait()就像Thread.Sleep(500)一样工作。那么我应该在我的代码中使用哪一个?
从互联网上的很多文章来看,我有一种印象,即Task.Delay支持Thread.Sleep不支持的取消,所以如果我想在没有取消的情况下阻止我的线程一段时间,将使用Thread.Sleep比Task.Delay好吗?答案 0 :(得分:5)
如果您需要取消,Task.Delay
是一个简单的解决方案。我在Thread.Sleep
之上有开销:它构造一个计时器,当你等待这个任务时,你构造一个由计时器发出信号的等待句柄。
那就是说,你只会注意到紧密循环中的这种开销(并且睡眠节流循环很少紧张)。
使用Thread.Sleep
进行屏蔽而不取消。这就是它一直以来的方式。它是众所周知的,也是惯用的。使用Task.Delay(...).Wait();
取消支持。
您可以通过许多其他方式执行此操作。例如,构建SemaphoreSlim
或TaskCompletionSource
并使用CancellationToken
等待它。但是,这并不像Task.Delay
那么简单。
答案 1 :(得分:1)
可能直接调用Thread.Sleep
API的Sleep()
优于创建Task.Delay
对象的Task
。 Task.Deley
需要更多的开销和更长的代码。
代码越简单越好。