Beklenebilir Thread.Sleep nasıl edinilir?


139

Bekleme / uyku paradigmasına dayalı ağa bağlı bir uygulama yazıyorum.

Bazen bağlantı hataları meydana gelir ve tecrübelerime göre bir süre beklemek ve daha sonra işlemi tekrar denemek gerekir.

Sorun ben Thread.Sleep veya benzer / async benzer bir engelleme işlemi kullanırsanız, arayan iş parçacığındaki tüm etkinliği engeller.

Aynı etkiyi elde etmek için Thread.Sleep (10000) ile ne değiştirmeliyim?

await Thread.SleepAsync(10000)

?

GÜNCELLEME

Herhangi bir ek iş parçacığı oluşturmadan bunu yapan bir cevap tercih edeceğim

Yanıtlar:


323

Yeni bir konu başlatmayı öneren diğer cevaplar kötü bir fikirdir - bunu yapmaya gerek yoktur. Noktasında bir kısmı async/ awaitetmektir azaltmak parçacığı uygulamanızın ihtiyaç sayısını.

Bunun yerine kullanmalısın Task.Delay hangi gelmez yeni bir iş parçacığı gerektirir ve bu amaçla tam tasarlanmıştır:

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

Hala a4.5 şeyler ile ilgilenmeye geliyorum. Bu ifadeden sonra kod üzerinde yürütme dalı nerede? Uyku / engelleme kısmı onu çalıştırıyor mu yoksa bekleyen 'iş parçacığı' mı? Ana engellemesiz yürütme sadece bloğu takip ediyor mu (diğer adıyla geri dönüş)?
Kenny

1
Evet. Bu tam ihtiyacım olan şey
Arsen Zahray

1
@kenny: Sen benim bulabilirsiniz asyncintro yararlı. Tarafından döndürülen awaitable zaman Task.Delayolduğu awaited tamamlandığını olmadığından, mevcut yöntem tamamlanmamış bir görevi döndürür. Daha sonra, Delaytamamlandığında (zamanlayıcı kapalı, iş parçacığı değil), yöntemin geri kalanının çalışması planlanır. Devamı bir "bağlam" çalışır olabilecek ayrıntıları blogumda - aynı orijinal iplik dönmek.
Stephen Cleary

@StephenCleary bunun için teşekkürler. Bu yüzden bekledikten sonra kod yürütme için 'zamanlanmış' olduğunu ve arama iş parçacığının döndürdüğünü söyleyerek haklı mıyım?
Kenny

2
Evet, çağıran evre döner (hemen) ve awaitplanlanandan sonraki kod (sonunda).
Stephen Cleary
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.