Як отримати очікуваний Thread.Sleep?


139

Я пишу застосований до мережі додаток на основі парадигми очікування / сну.

Іноді трапляються помилки підключення, і, на мій досвід, варто зачекати деякий час, а потім повторити операцію знову.

Проблема полягає в тому, що якщо я використовую Thread.Sleep або іншу подібну операцію блокування в режимі очікування / асинхронізація, вона блокує всю активність у потоці виклику.

Чим слід замінити 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);

Я все ще стикаюся з матеріалами a4.5. Де знаходиться відділення виконання коду після цієї заяви? Чи виконує її не спляча / блокуюча частина або "нитка", яка чекає? Чи залишає головне незаблокувальне виконання просто блок після (aka return)?
kenny

1
так. Це ТОЧНО те, що мені потрібно
Арсен Захрай

1
@kenny: Ви можете знайти моє asyncвведення корисно. Коли awaitable повертається Task.Delayв awaitЕ.Д., так як вона не завершена, поточний метод повертає неповну завдання. Пізніше, коли Delayзавершується (відключений таймер, а не потік), решту методу планується запустити. Продовження працює в "контексті", який може повернутися до тієї ж оригінальної теми - деталі в моєму блозі.
Стівен Клірі

@StephenCleary за це дякую. Тож я маю рацію сказати, що код після очікування "запланований" на виконання, а викликовий потік повертається?
kenny

2
Так, виклик потоку повертається (негайно) і код після awaitзапланованого (зрештою).
Стівен Клірі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.