.Wait () ile .GetAwaiter (). GetResult () arasındaki fark nedir?


89

Yöntemim geri dönüyor Task. Bitene kadar beklemek istiyorum. Ne kullanmalıyım .Wait()veya .GetAwaiter().GetResult()? Onların arasındaki fark ne?

Yanıtlar:


110

Her ikisi de işlemin sonucu için eşzamanlı beklemedir (ve mümkünse bunlardan kaçınmalısınız).

Aradaki fark esas olarak istisnaları ele almaktır. İle Wait, istisna yığın izlemesi değiştirilmez ve istisna anında gerçek yığını temsil eder, bu nedenle bir iş parçacığı havuzu iş parçacığı üzerinde çalışan bir kod parçanız varsa, aşağıdaki gibi bir yığına sahip olursunuz:

ThreadPoolThread.RunTask
YourCode.SomeWork

Öte yandan, .GetAwaiter().GetResult()kodun bazı bölümlerinin UI iş parçacığında ve bazılarının bir ThreadPool iş parçacığında yürütülmesini ve bazılarının da basitçe eşzamansız G / Ç olduğunu göz ardı ederek tüm eşzamansız bağlamı hesaba katmak için yığın izini yeniden çalışacaktır. Böylece yığın izlemeniz, kodunuzda eşzamanlı bir adımı yansıtacaktır :

TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork

Bu, istisna yığın izlerini en hafif tabirle çok daha kullanışlı hale getirme eğilimindedir. "Çalıştırıldığı fiziksel yol" yerine uygulamanızın bağlamında nereye YourCode.SomeWorkçağrıldığını görebilirsiniz .

Bunun nasıl çalıştığına dair bir örnek, referans kaynaktadır (tabii ki sözleşme dışı).


6
Task.GetAwaiter () bir TaskAwaiter döndürür . Ancak TaskAwaiter.GetResult () dokümanı şunu tavsiye eder: "Bu API, ürün altyapısını destekler ve doğrudan kodunuzdan kullanılması amaçlanmamıştır." Yorum yapar mısın
DavidRR

24
@DavidRR Bütün TaskAwaiterbir uygulama detayıdır. Öte yandan, awaitable / awaiter mekanizması belgelenmiştir ve kullanımları ördek yazma - GetAwaiteretmektir awaitolarak GetEnumeratoretmektir foreachveya Disposeetmektir using. Tüm bunlar, kullanılan özel beklemeye bakılmaksızın C # belirtiminde tanımlanmıştır - Task.GetAwaiter"uygulama kodunda kullanılmaktan ziyade derleyici kullanımı içindir." Ama asıl kullanım amacı bir yapmak olmasıdır await, değil Wait()ne de GetAwaiter().GetResult()ancak - GetResultİhtiyacınız olduğunda size daha güzel yığınlarını verir.
Luaan
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.