ChatGPT解决这个技术问题 Extra ChatGPT

如何获得可等待的 Thread.Sleep?

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

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

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

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

await Thread.SleepAsync(10000)

?

更新

我更喜欢在不创建任何额外线程的情况下执行此操作的答案


A
Alexei - check Codidact

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

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

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

如果提供了取消令牌,此解决方案还具有 allowing cancellation 的优势。例子:

public async Task DoWork(CancellationToken token)
{
    await Task.Delay(1000, token);
}

我仍然在处理 a4.5 的东西。该语句之后的代码执行分支在哪里?非睡眠/阻塞部分是执行它还是等待的“线程”?主要的非阻塞执行是否只是将块留在后面(又名返回)?
是的。这正是我需要的
@kenny:您可能会发现我的 async intro 很有帮助。当 Task.Delay 返回的 awaitable 被 await 处理时,由于它不完整,当前方法返回一个不完整的任务。稍后,当 Delay 完成时(关闭计时器,而不是线程),该方法的其余部分被安排运行。延续在“上下文”中运行,可能返回到相同的原始线程 - 我的博客上的详细信息。
@StephenCleary 对此表示感谢。那么我是否正确地说等待之后的代码被“计划”执行并且调用线程返回?
是的,调用线程(立即)返回并且 await 之后的代码被调度(最终)。