Pelaksanaan segerak bagi tugas tak segerak: perbezaan antara Task.Result dan Task.GetAwaiter().GetResult()
Apabila berurusan dengan kaedah tak segerak, kadangkala anda perlu melaksanakannya secara serentak. Walau bagaimanapun, terdapat dua cara biasa untuk melaksanakan secara serentak: Task.Result
dan Task.GetAwaiter().GetResult()
, dan terdapat perbezaan utama antara keduanya.
Perbandingan Tugasan.Tunggu dan Tugasan.GetAwaiter().GetResult()
Task.Wait
dan Task.GetAwaiter().GetResult()
kedua-duanya membenarkan tugas tak segerak dilaksanakan secara serentak. Walau bagaimanapun, mekanisme pengendalian pengecualian mereka adalah berbeza. Task.Wait
membalut sebarang pengecualian dalam AggregateException
, manakala Task.GetAwaiter().GetResult()
melemparkan pengecualian asal secara langsung.
Cadangan
Untuk mengendalikan pengecualian mentah secara langsung, Task.GetAwaiter().GetResult()
adalah lebih baik daripada Task.Wait
. Walau bagaimanapun, kedua-dua kaedah harus dielakkan memihak kepada penggunaan async/await
kerana dua yang pertama boleh menyebabkan kebuntuan dan masalah keletihan sumber kumpulan benang.
Sebab perbezaan
Perbezaan dalam pengendalian pengecualian antaraTask.Wait
dan Task.GetAwaiter().GetResult()
berpunca daripada keperluan keserasian ketat Microsoft. Untuk mengelak daripada memecahkan kod sedia ada, Task.Wait
mengekalkan tingkah laku menyekat asalnya, membalut pengecualian dalam AggregateException
.
Untuk mencetuskan penyebaran pengecualian secara langsung, anda boleh menggunakan task.GetAwaiter().GetResult()
. Ambil perhatian bahawa Task.Result
menyemak ralat tugas dan bukannya menyekat pelaksanaannya.
Atas ialah kandungan terperinci Task.Result vs. Task.GetAwaiter().GetResult(): Apakah Perbezaan dalam Pelaksanaan Segerak dan Pengendalian Pengecualian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!