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?
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:
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ışı).
TaskAwaiter
bir uygulama detayıdır. Öte yandan, awaitable / awaiter mekanizması belgelenmiştir ve kullanımları ördek yazma - GetAwaiter
etmektir await
olarak GetEnumerator
etmektir foreach
veya Dispose
etmektir 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.