我们应该使用Task.Delay来替换Thread.Sleep

时间:2014-08-14 10:41:52

标签: multithreading task-parallel-library c#-5.0

我正在研究新的TPL,以使我的自制工作流程更好。

现在,我进入了Task.Delay和Thread.Sleep的迷宫。实际上,Task.Delay(50).Wait()就像Thread.Sleep(500)一样工作。那么我应该在我的代码中使用哪一个?

从互联网上的很多文章来看,我有一种印象,即Task.Delay支持Thread.Sleep不支持的取消,所以如果我想在没有取消的情况下阻止我的线程一段时间,将使用Thread.Sleep比Task.Delay好吗?

2 个答案:

答案 0 :(得分:5)

如果您需要取消,Task.Delay是一个简单的解决方案。我在Thread.Sleep之上有开销:它构造一个计时器,当你等待这个任务时,你构造一个由计时器发出信号的等待句柄。

那就是说,你只会注意到紧密循环中的这种开销(并且睡眠节流循环很少紧张)。

使用Thread.Sleep进行屏蔽而不取消。这就是它一直以来的方式。它是众所周知的,也是惯用的。使用Task.Delay(...).Wait();取消支持。

您可以通过许多其他方式执行此操作。例如,构建SemaphoreSlimTaskCompletionSource并使用CancellationToken等待它。但是,这并不像Task.Delay那么简单。

答案 1 :(得分:1)

可能直接调用Thread.Sleep API的Sleep()优于创建Task.Delay对象的TaskTask.Deley需要更多的开销和更长的代码。

代码越简单越好。