2016-04-05 8 views

cevap

33

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).

+4

[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

+7

@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