Task.GetAwaiter().GetResult()
lebih disukai daripada Task.Wait
dan Task.Result
karena menyebarkan pengecualian daripada membungkusnya dalam AggregateException
. Namun, ketiga metode ini berpotensi menyebabkan masalah kebuntuan dan masalah pool thread. Mereka semua harus dihindari demi async/await
.
Kutipan di bawah ini menjelaskan mengapa Task.Wait
dan Task.Result
tidak hanya berisi perilaku propagasi pengecualian Task.GetAwaiter().GetResult()
(karena "bilah kompatibilitas sangat tinggi").
Seperti yang saya sebutkan sebelumnya, kami memiliki bilah kompatibilitas yang sangat tinggi, dan karenanya kami menghindari perubahan. Karena itu, Task.Wait
pertahankan perilaku awalnya yaitu selalu membungkus. Namun, Anda mungkin menemukan diri Anda dalam beberapa situasi lanjut di mana Anda ingin perilaku yang mirip dengan pemblokiran sinkron yang digunakan oleh Task.Wait
, tetapi di mana Anda ingin pengecualian asli diperbanyak tanpa membuka dan tidak terbungkus dalam AggregateException
. Untuk mencapai itu, Anda dapat menargetkan penunggu Tugas secara langsung. Ketika Anda menulis " await task;
", kompiler menerjemahkannya menjadi penggunaan Task.GetAwaiter()
metode, yang mengembalikan contoh yang memiliki GetResult()
metode. Ketika digunakan pada Tugas yang salah, GetResult()
akan menyebarkan pengecualian asli (ini adalah bagaimana " await task;
" mendapatkan perilakunya). Dengan demikian Anda dapat menggunakan "task.GetAwaiter().GetResult()
”Jika Anda ingin secara langsung mengaktifkan logika propagasi ini.
https://blogs.msdn.microsoft.com/pfxteam/2011/09/28/task-exception-handling-in-net-4-5/
" GetResult
" Sebenarnya berarti "memeriksa kesalahan tugas"
Secara umum, saya mencoba yang terbaik untuk menghindari pemblokiran secara sinkron pada tugas asinkron. Namun, ada beberapa situasi di mana saya melanggar pedoman itu. Dalam kondisi langka itu, metode pilihan saya adalah GetAwaiter().GetResult()
karena mempertahankan pengecualian tugas daripada membungkusnya dalam AggregateException
.
http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html
GetResult
: "Jenis ini dan anggotanya dimaksudkan untuk digunakan oleh kompiler." Orang lain seharusnya tidak menggunakannya.