【问题标题】:How to get awaitable Thread.Sleep?如何获得可等待的 Thread.Sleep?
【发布时间】:2012-11-05 22:51:54
【问题描述】:

我正在编写一个基于等待/睡眠范式的网络绑定应用程序。

有时会发生连接错误,根据我的经验,等待一段时间然后重试操作是值得的。

问题是,如果我在 await/async 中使用 Thread.Sleep 或其他类似的阻塞操作,它会阻塞调用者线程中的所有活动。

应该用什么替换 Thread.Sleep(10000) 才能达到与

相同的效果
await Thread.SleepAsync(10000)

?

更新

我更喜欢不创建任何额外线程的答案

【问题讨论】:

    标签: c# .net multithreading async-await


    【解决方案1】:

    建议开始一个新线程的其他答案是一个坏主意 - 根本没有必要这样做。 async/await 的部分目的是减少您的应用程序需要的线程数。

    您应该改用Task.Delay,它不需要需要一个新线程,并且正是为此目的而设计的:

    // Execution of the async method will continue one second later, but without
    // blocking.
    await Task.Delay(1000);
    

    【讨论】:

    • 我还在着手处理 a4.5 的东西。该语句之后的代码执行分支在哪里?非睡眠/阻塞部分是执行它还是等待的“线程”?主要的非阻塞执行是否只是将块留在后面(也称为返回)?
    • 是的。这正是我需要的
    • @kenny:您可能会发现我的async intro 很有帮助。当Task.Delay返回的awaitable为awaited时,由于它不完整,当前方法返回一个不完整的任务。稍后,当Delay 完成时(关闭计时器,而不是线程),该方法的其余部分被安排运行。延续在“上下文”中运行,可能返回到相同的原始线程 - 我的博客上的详细信息。
    • @StephenCleary 谢谢你。那么我是否正确地说等待之后的代码被“计划”执行并且调用线程返回?
    • 是的,调用线程(立即)返回并且await之后的代码被调度(最终)。
    猜你喜欢
    • 2013-03-20
    • 2018-07-13
    • 1970-01-01
    • 2021-06-20
    • 2012-12-08
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多