【问题标题】:Should we use Task.Delay to replace Thread.Sleep我们是否应该使用 Task.Delay 来替换 Thread.Sleep
【发布时间】:2014-10-07 23:44:12
【问题描述】:

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

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

从互联网上的许多文章中,我的印象是 Task.Delay 支持取消,而 Thread.Sleep 不支持,所以如果我只想阻塞我的线程一段时间而不取消,是否会使用 Thread.Sleep比 Task.Delay 更好?

【问题讨论】:

  • 我不想假设一个单独的问题,但我感兴趣 - 在这种情况下,最好使用计时器?
  • @BoguszM Task.Delay 使用定时器

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


【解决方案1】:

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

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

使用Thread.Sleep 进行阻塞而不取消。这就是它一直以来的做法。这是众所周知的和惯用的。使用 Task.Delay(...).Wait(); 获得取消支持。

您可以通过许多其他方式做到这一点。例如,构造一个SemaphoreSlimTaskCompletionSource 并使用CancellationToken 等待它。不过,这不像Task.Delay 那么简单。

【讨论】:

    【解决方案2】:

    也许Thread.Sleep,可以直接调用Sleep() API,会比Task.Delay,创建Task对象更好。 Task.Deley 需要更多开销和更长的代码。

    代码越简单越好。

    【讨论】:

      猜你喜欢
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2021-12-22
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多