Piszę aplikację sieciową opartą na paradygmacie await / sleep.
Czasami zdarzają się błędy połączenia i z mojego doświadczenia wynika, że warto poczekać jakiś czas, a następnie ponowić operację.
Problem polega na tym, że jeśli używam Thread.Sleep lub innej podobnej operacji blokowania w await / async, blokuje całą aktywność w wątku wywołującego.
Czym powinienem zastąpić Thread.Sleep (10000), aby uzyskać taki sam efekt jak
await Thread.SleepAsync(10000)
?
AKTUALIZACJA
Wolę odpowiedź, która robi to bez tworzenia dodatkowego wątku
źródło
async
intro może być pomocne. Gdy awaitable zwrócone przezTask.Delay
jestawait
ed, ponieważ nie jest ukończone, bieżąca metoda zwraca niekompletne zadanie. Później, gdyDelay
zakończy się (poza licznikiem czasu, a nie wątkiem), reszta metody zostanie zaplanowana do uruchomienia. Kontynuacja przebiega w „kontekście”, który może powrócić do tego samego oryginalnego wątku - szczegóły na moim blogu.await
zaplanowaniu (ostatecznie).