await
lwn. Task.Result
untuk Tugasan Selesai: Amalan Terbaik
"Concurrency in C# Cookbook" menunjukkan corak untuk mengendalikan tugasan yang telah selesai:
var completedTask = await Task.WhenAny(downloadTask, timeoutTask); if (completedTask == timeoutTask) return null; return await downloadTask;
Kod ini menggunakan Task.WhenAny
untuk menentukan sama ada downloadTask
(panggilan httpclient.GetStringAsync
) selesai sebelum timeoutTask
(operasi Task.Delay
).
Mengapa menggunakan await downloadTask
dan bukannya hanya mengembalikan downloadTask.Result
? Sebabnya adalah penting:
Pengendalian Pengecualian:
await
mengelakkan kerumitan AggregateException
. Task.Result
atau Task.Wait()
bungkus pengecualian dalam AggregateException
, mengaburkan punca. Kod tak segerak seharusnya mengendalikan pengecualian secara langsung, menjadikan await
penyelesaian yang lebih bersih.Mengelakkan Kebuntuan:
Task.Result
atau Task.Wait()
dalam kaedah tak segerak boleh menyebabkan kebuntuan. await
direka untuk konteks tak segerak dan menghalang perangkap biasa ini.Ringkasan Amalan Terbaik:
await
dalam kod aplikasi tak segerak untuk pengendalian pengecualian yang lebih baik dan pencegahan kebuntuan.Task.Result
atau Task.Wait()
mungkin boleh diterima dalam kod utiliti (dengan komen yang jelas menerangkan rasionalnya), ia lebih baik dielakkan.Task.Result
dan Task.Wait()
boleh dipertimbangkan untuk senario tugasan selari di mana penyekatan segerak boleh diterima dan difahami.Atas ialah kandungan terperinci Bilakah Anda Harus Menggunakan `menunggu` Daripada `Task.Result` untuk Tugasan yang Selesai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!