【问题标题】:Thread.Sleep is terminating the current task [closed]Thread.Sleep 正在终止当前任务 [关闭]
【发布时间】:2016-03-09 16:33:33
【问题描述】:

我有一个创建 10 个并行任务的程序,在每个任务中我需要等待 90 秒,我正在使用 Thread.Sleep(90000)。它工作正常,但有时它似乎正在终止当前线程。操作正在等待 90 秒没有工作。

请提出问题所在。

【问题讨论】:

  • 您可以使用await Task.Delay(90) 等待您想要延迟的每个任务!
  • 它会暂停当前任务还是我的所有 10 个任务?
  • 不,它会等待在自己运行此代码的任务
  • Task.WaitAll to 等待所有提供的 Task 对象完成执行。

标签: c# multithreading task-parallel-library


【解决方案1】:

由于您正在处理任务,我建议您不要使用 thread.sleep。我怀疑你要找的是Task.Delay。例如

public async Task DoWork()
{
    await Task.Delay(90000);
}

这将延迟当前任务,无论它正在哪个线程上执行,并且不会干扰其他任务。

【讨论】:

  • 这对问题中的问题有何帮助(“有时它似乎正在终止当前线程”)?
【解决方案2】:

当你想阻塞当前线程时使用Thread.Sleep

当你想要一个逻辑延迟而不阻塞当前线程时使用Task.Delay

例如:

async Task PutTaskDelay()
{
    await Task.Delay(90000); // 9sec
} 

效率不应该是这些方法的首要考虑因素。它们在现实世界中的主要用途是作为 I/O 操作的重试计时器,其数量级是秒而不是毫秒。

【讨论】:

  • 这对问题中的问题有何帮助(“有时它似乎正在终止当前线程”)?
【解决方案3】:

你必须使用 Task.Delay

  int N = 9;
  Parallel.For(0, N, async delegate(int i)
   {
                await Task.Delay(90000);
   });

编辑:

引用此question Parallel.For() 不适用于 async 方法。

var tasks = Enumerable.Range(0, 5).Select(async i =>
            {
                await Task.Delay(90);
            });
 await Task.WhenAll(tasks);

【讨论】:

  • 永远不要将Parallel.Forasync-await 组合在一起。它不会像你想的那样做。恰当的例子:您的代码立即返回,而不是在 90 秒之后。
  • 是的@svick 是的,谢谢,我必须更新我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多