Reputation: 25287
I'm writing a network-bound application based on await/sleep paradigm.
Sometimes, connection errors happen, and in my experience it pays to wait for some time and then retry operation again.
The problem is that if I use Thread.Sleep or another similar blocking operation in await/async, it blocks all activity in the caller thread.
What should I replace Thread.Sleep(10000) with to achieve the same effect as
await Thread.SleepAsync(10000)
?
UPDATE
I'll prefer an answer which does this without creating any additional thread
Upvotes: 217
Views: 91890
Reputation: 1499750
The other answers suggesting starting a new thread are a bad idea - there's no need to do that at all. Part of the point of async
/await
is to reduce the number of threads your application needs.
You should instead use Task.Delay
which doesn't require a new thread, and was designed precisely for this purpose:
// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);
This solution also has the advantage of allowing cancellation, if a cancellation token is provided. Example:
public async Task DoWork(CancellationToken token)
{
await Task.Delay(1000, token);
}
Upvotes: 475