如何获得等待的Thread.Sleep?


139

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

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

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

我应该用Thread.Sleep(10000)代替以达到与

await Thread.SleepAsync(10000)

更新

我希望这样做而不创建任何其他线程的答案

Answers:


322

其他建议启动新线程的答案是个坏主意-根本不需要这样做。点的一部分async/ await减少线程应用程序需要的数量。

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

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

我仍然对a4.5东西有所了解。该语句之后的代码执行分支在哪里?非睡眠/阻塞部分是执行它还是等待的“线程”?主要的非阻塞执行是否只留下后面的块(又名return)?
肯尼2012年

1
是的 这正是我所需要的
Arsen Zahray 2012年

1
@kenny:您可能会觉得我的async介绍很有帮助。当返回的awaitable Task.Delayawait编的,因为它不是完整的,目前的方法返回一个未完成的任务。稍后,当Delay完成(关闭计时器,而不是线程)时,将计划运行该方法的其余部分。继续在“上下文”中运行,该上下文可能返回相同的原始线程-我的博客上的详细信息。
Stephen Cleary 2012年

@StephenCleary对此表示感谢。所以我说对了吗?等待之后的代码被“调度”为执行并且调用线程返回了吗?
肯尼2012年

2
是的,调用线程(立即)返回,await并且调度了(最终)之后的代码。
Stephen Cleary 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.