异步Thread.Sleep()

alb*_*ert 18 .net multithreading

我想在两个操作之间放一个延迟而不保持线程忙

 workA();
 Thread.Sleep(1000);
 workB();
Run Code Online (Sandbox Code Playgroud)

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

我想知道这个伪代码是否有可能出现

workA();
Thread.BeginSleep(1000, workB); // callback
Run Code Online (Sandbox Code Playgroud)

编辑我的程序在.NET 2.0中

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

Mar*_*ell 39

你的意思是:

Task.Delay(1000).ContinueWith(t => workB());
Run Code Online (Sandbox Code Playgroud)

或者,Timer手动创建.

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

async Task Foo() {
    workA();
    await Task.Delay(1000);
    workB();
}
Run Code Online (Sandbox Code Playgroud)

编辑:使用.NET 2.0更新,您必须Timer使用回调设置自己的.有一个nuget包System.Threading.TasksTaskAPI下载到.NET 3.5,但是:它不会转到2.0,而b:我不认为它包含Task.Delay.

  • @Josh,你让我哭了一下.请不要那样做.如果你很幸运,它只会非常低效.如果你运气不好:你刚刚陷入困境.这一切都取决于同步上下文.如果你想同步等待:`Thread.Sleep(1000)` (4认同)
  • 感谢您的答复,我想您没有任何地方可以阅读有关此内容的更多信息(我的意思是为什么)?(特别是死锁线程部分) (2认同)
  • 对于将来对<Task> .Wait()感兴趣的人来说,它实际上是在阻塞,因此完全无法实现异步调用的目的,Marcs推理对我来说现在很有意义。 (2认同)