await Task.Run
dalam Kaedah Async: Perlu atau Tidak?Penggunaan await Task.Run
dalam kaedah async sering menyebabkan kekeliruan. Mari kita jelaskan perkara ini dengan contoh:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
berbanding dengan:
<code class="language-csharp">await LongProcess();</code>
di mana LongProcess
ialah kaedah tak segerak yang mengandungi berbilang panggilan tak segerak (mis., DbDataReader.ExecuteReaderAsync()
).
Perbezaan Utama:
Dalam kes ini, await Task.Run
adalah berlebihan. Ia memperkenalkan tugas tambahan yang tidak perlu dalam kaedah yang sudah tidak segerak. Kaedah Async sudah memanfaatkan konkurensi melalui kumpulan benang. Menambah Task.Run
menghasilkan overhed yang tidak perlu.
Penjelasan:
Async/menunggu memudahkan pelaksanaan kod tanpa sekatan. Benang terus memproses tugas lain sementara menunggu penyempurnaan operasi tak segerak. Apabila kaedah async dipanggil, urutan tidak disekat; kata kunci await
membenarkan urutan untuk menyambung semula pelaksanaan sebaik sahaja operasi selesai.
Pertimbangan Penting:
await
dan disambung semula apabila tugasan yang ditunggu selesai. Walaupun penukaran konteks mungkin melibatkan benang yang berbeza di bawah hud, aliran logik sebahagian besarnya kekal satu benang.Task.Run
adalah bermanfaat. Memunggah pengiraan ke urutan latar belakang menghalang urutan UI utama, memastikan tindak balas.Kesimpulan:
Untuk senario yang dibentangkan, menggunakan terus await LongProcess()
ialah pendekatan yang optimum dan lebih cekap. Kaedah Async sememangnya mengendalikan konkurensi; menambah Task.Run
tidak memberi faedah dan menambah kerumitan.
Atas ialah kandungan terperinci Bilakah Anda Harus Menggunakan `await Task.Run` dalam Kaedah Async?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!