Benim yöntemim Task
döndürür. Bitene kadar beklemek istiyorum. Ben .Wait()
veya .GetAwaiter().GetResult()
ne kullanmalıyım? Onların arasındaki fark ne?.GetAwaiter() vs .Wait() arasındaki fark nedir. GetResult()?
cevap
Her ikisi de işlemin sonucu için senkron bir bekleme süresidir (ve mümkünse bunlardan kaçınmalısınız).
Buradaki fark esas olarak istisnaları ele alma konusudur. Wait
ile durum yığın izlemesi değiştirilmemiş olup istisna sırasında fiili yığını olarak temsil ettiği bir iş parçacığı havuzu iş parçacığı üzerinde çalışan bir kod parçası varsa,
ThreadPoolThread.RunTask
YourCode.SomeWork
gibi bir yığın olurdu
Diğer yandan, .GetAwaiter().GetResult()
, tüm eşzamansız bağlamı hesaba katmak için yığın izini yeniden işleyerek, kodun bazı bölümlerinin UI iş parçacığında ve bazıları ThreadPool iş parçacığında yürütüldüğünü ve bazılarının eşzamansız I/O olduğunu göz ardı eder. . Az söylemek,
TheSyncMethodThatWaitsForTheAsyncMethod
YourCode.SomeAsyncMethod
SomeAsync
YourCode.SomeWork
Bu istisna yığını yapma eğilimi çok daha yararlı izleri: Yani yığın izleme Kodunuzdaki ile senkron benzeri adımı yansıtacaktır. Uygulamanızın yerine,'un olarak adlandırıldığı yeri, "çalıştırıldığı fiziksel yoldan" ziyade görebilirsiniz.
Bunun nasıl çalıştığı ile ilgili bir örnek reference source (sözleşme dışı, tabi ki).
[Task.GetAwaiter()] (https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.getawaiter%28v=vs.110%29.aspx) bir [döndürür TaskAwaiter] (https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.taskawaiter%28v=vs.110%29.aspx). Ancak, [TaskAwaiter.GetResult()] belgesinin (https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.taskawaiter.getresult%28v=vs.110%29.aspx) önerileri : * "Bu API ürün altyapısını destekler ve doğrudan kodunuzdan kullanılmaz." * Yorum yapabilir misiniz? – DavidRR
@DavidRR Bütün 'TaskAwaiter' bir uygulama detayıdır. Öte yandan, awaitable/awaiter mekanizması belgelenmiştir ve ördek yazmaya kullanır - GetEnumerator' foreach' 'için ya da 'olarak' GetAwaiter' için 'await'' Dispose' 'using' etmektir. Tüm bunlar, ne olursa olsun, belirli bir awaiter kullanıldığı C# tarifnamede tanımlandığı gibidir - 'Task.GetAwaiter' dikkat "yerine uygulama kodu kullanım için daha derleyici kullanılmak üzere tasarlanmıştır." . Ama nokta() 'ne de' GetAwaiter() GetResult() 'amaçlanan kullanımı,' await' değil 'Bekle yapmak olmasıdır - ama' de gerekirse GetResult' size güzel yığınlarını verir. – Luaan