如何获得等待的Thread.Sleep?

Ars*_*ray 120 .net c# multithreading async-await

我正在编写一个基于await/sleep范例的网络绑定应用程序.

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

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

我应该用什么来替换Thread.Sleep(10000)以获得相同的效果

await Thread.SleepAsync(10000)
Run Code Online (Sandbox Code Playgroud)

UPDATE

我更喜欢一个没有创建任何额外线程的答案

Jon*_*eet 281

其他答案表明开始一个新线程是一个坏主意 - 根本没有必要这样做.点的一部分async/ await减少线程应用程序需要的数量.

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

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

  • 注意这可以获得CancellationToken! (4认同)
  • 是的。这正是我需要的 (2认同)
  • @kenny:您可能会发现我的 [`async` 介绍](http://nitoprograms.blogspot.com/2012/02/async-and-await.html) 很有帮助。当 `Task.Delay` 返回的 awaitable 是 `await` 时,由于它没有完成,当前方法返回一个未完成的任务。稍后,当 `Delay` 完成时(关闭计时器,而不是线程),该方法的其余部分将被安排运行。延续在“上下文”中运行,它*可能*返回到相同的原始线程 - 我的博客上的详细信息。 (2认同)
  • 是的,调用线程返回(立即)并且调度`await`之后的代码(最终). (2认同)