Rumah >pembangunan bahagian belakang >C++ >Adakah `menunggu` pada Tugasan Selesai Sama dengan Menggunakan `Task.Result`?

Adakah `menunggu` pada Tugasan Selesai Sama dengan Menggunakan `Task.Result`?

DDD
DDDasal
2025-01-22 22:54:14851semak imbas

Is `await` on a Completed Task Identical to Using `Task.Result`?

await lwn. Task.Result untuk Tugasan Selesai: Analisis Perbandingan

"Concurrency in C# Cookbook" Stephen Cleary menunjukkan kaedah pengesanan penyelesaian tugas tanpa sekatan:

<code class="language-csharp">var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
if (completedTask == timeoutTask)
  return null;
return await downloadTask;</code>

Ini menimbulkan persoalan: Adakah await kedua perlu jika downloadTask sudah lengkap? Mengapa tidak hanya menggunakan downloadTask.Result?

Perbezaan utama terletak pada pengendalian pengecualian dan mengelakkan kebuntuan.

Pengendalian Pengecualian: Perbezaan Penting

Task.Result membungkus pengecualian dalam AggregateException, yang memerlukan pengendalian khusus. await, bagaimanapun, menyebarkan pengecualian secara langsung, menjajarkan lebih baik dengan aliran semula jadi kod tak segerak dan mengelakkan kerumitan pengurusan AggregateException.

Pencegahan Kebuntuan: Jaring Keselamatan

Task.Result dan Task.Wait boleh menimbulkan kebuntuan, terutamanya dalam kaedah tak segerak. Memandangkan menentukan penyelesaian tugas secara muktamad dalam senario dunia nyata selalunya mencabar, await menyediakan alternatif yang lebih selamat.

Amalan Terbaik untuk Pengendalian Tugas

Untuk memastikan pengaturcaraan tak segerak yang mantap dan bebas kebuntuan, ikut garis panduan ini:

  1. Kod tak segerak peringkat aplikasi: Lebih suka await secara eksklusif.
  2. Kod tak segerak peringkat perpustakaan: Task.Result atau Task.Wait mungkin boleh diterima dalam fungsi utiliti tertentu, tetapi sentiasa dengan dokumentasi yang jelas yang menggariskan potensi risiko.
  3. Kod tugas selari: Task.Result dan Task.Wait mungkin lebih sesuai dalam senario selari yang dikawal dengan teliti.

Dalam kebanyakan situasi, await ialah pendekatan yang disyorkan untuk mengendalikan tugas yang telah selesai, menjamin operasi tak segerak yang boleh dipercayai dan bebas kebuntuan.

Atas ialah kandungan terperinci Adakah `menunggu` pada Tugasan Selesai Sama dengan Menggunakan `Task.Result`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn