【问题标题】:Asynchronous Thread.Sleep()异步线程.Sleep()
【发布时间】:2013-04-10 11:11:16
【问题描述】:

我想在 2 个操作之间设置一个延迟而不让线程忙

 workA();
 Thread.Sleep(1000);
 workB();

线程必须在 workA 之后退出并在延迟一段时间后执行 workB(可能在新线程中)。

我想知道是否有可能与此伪代码等价

workA();
Thread.BeginSleep(1000, workB); // callback

编辑 我的程序在 .NET 2.0 中

编辑 2: System.Timers.Timer.Elapsed 事件将在 1000 毫秒后引发事件。我不知道计时器线程是否会忙 1000 毫秒。 (所以我没有获得线程经济)

【问题讨论】:

  • 不明白。您的 Thread.Sleep() 调用将在 2 个操作之间延迟,而不会保持线程忙碌。我误会你想要什么了吗?
  • 是的,但是这段时间(1000 毫秒)的线程池将少 1 个可用线程。
  • 你可能更喜欢System.Threading.Timer - 不是System.Timers.Timer 并且不 - 没有“计时器线程” - 等待在操作系统内核中控制
  • MSDN: Comparing the Timer Classes - 如果您有 SynchronizationContext 参与,System.Timers.Timer 很有用。
  • 感谢 Nicholas 的澄清

标签: .net multithreading


【解决方案1】:

你的意思是:

Task.Delay(1000).ContinueWith(t => workB());

或者,手动创建Timer。

注意这在async 代码中看起来更漂亮:

async Task Foo() {
    workA();
    await Task.Delay(1000);
    workB();
}

编辑:随着您的 .NET 2.0 更新,您必须设置自己的带有回调的 Timer。有一个 nuget 包 System.Threading.Tasks 将 Task API 降低到 .NET 3.5,但是 a:它不会转到 2.0,并且 b:我认为它不包括 Task.Delay。

【讨论】:

  • 甚至 Task.Delay(1000).Wait(); 如果您不想要异步函数。
  • @Josh 你让我哭了一点。请永远不要那样做。如果你幸运的话,它只会非常低效。如果你不走运:你刚刚死锁了一个线程。这一切都取决于同步上下文。如果要同步等待:Thread.Sleep(1000)
  • 感谢您的回复,我想您没有任何地方可以阅读更多关于此的内容(我的意思是为什么)? (尤其是线程部分的死锁)
  • 对于任何对未来感兴趣的人,<Task>.Wait() 实际上是阻塞的,因此完全违背了异步调用的目的,Marcs 的推理现在对我来说很有意义。
猜你喜欢
  • 2018-05-31
  • 2021-11-22
  • 2013-10-13
  • 2020-07-08
  • 2010-09-08
  • 2022-01-16
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
相关资源
最近更新 更多