Как получить ожидаемую тему. Сон?

139

Я пишу сетевое приложение, основанное на парадигме ожидания / сна.

Иногда возникают ошибки подключения, и по моему опыту стоит подождать некоторое время, а затем повторить попытку.

Проблема заключается в том, что если я использую Thread.Sleep или другую подобную операцию блокировки в await / async, он блокирует всю активность в потоке вызывающего.

Чем заменить Thread.Sleep (10000) на тот же эффект, что и

await Thread.SleepAsync(10000)

?

ОБНОВИТЬ

Я предпочитаю ответ, который делает это без создания дополнительной темы

Арсен Захрай
источник

Ответы:

323

Другие ответы, предполагающие начало новой темы, - плохая идея - делать это вообще не нужно. Частью async/ awaitявляется уменьшение количества потоков, необходимых вашему приложению.

Вместо этого вы должны использовать тот, Task.Delayкоторый не требует нового потока, и был разработан именно для этой цели:

// Execution of the async method will continue one second later, but without
// blocking.
await Task.Delay(1000);
Джон Скит
источник
Я все еще вступаю в борьбу с вещами А4.5. Где находится ветвь выполнения в коде после этого оператора? Не исполняющая / блокирующая часть выполняет его или ожидающий поток? Основное неблокирующее выполнение просто оставляет блок следующий (иначе возврат)?
Кенни
1
Да. Это именно то, что мне нужно
Арсен Захрай
1
@kenny: моё asyncвступление может оказаться полезным. Когда awaitable возвращаемая Task.Delayв awaitЕ.Д., так как она не завершена, текущий метод возвращает неполную задачу. Позже, когда Delayзавершается (отключение по таймеру, а не по потоку), остаток метода планируется запустить. Продолжение работает в «контексте», который может вернуться к той же исходной теме - подробности в моем блоге.
Стивен Клири
@StephenCleary спасибо за это. Итак, правильно ли я сказал, что код после await «запланирован» для выполнения и вызывающий поток возвращается?
Кенни
2
Да, вызывающий поток возвращает (немедленно) и код после awaitзапланированного (в конце концов).
Стивен Клири