pengaturcaraan tak segerak .NET: Pilihan kaedah await Task.Run
dan await Async
Dalam pengaturcaraan tak segerak .NET, penggunaan kaedah tak segerak await Task.Run
dan await
sering mengelirukan. Artikel ini akan menggambarkan perbezaan antara keduanya melalui senario konkrit dan memberikan pemahaman yang menyeluruh.
Adegan:
Pertimbangkan dua coretan kod berikut:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
dan
<code class="language-csharp">await LongProcess();</code>
di mana LongProcess
ialah kaedah tak segerak, termasuk panggilan tak segerak, seperti await ExecuteReaderAsync()
.
Jawapan:
Dalam senario khusus ini, tiada perbezaan yang ketara antara kedua-dua kaedah. Kedua-duanya menggunakan kata kunci await
untuk mengembalikan kawalan kepada pemanggil sebelum operasi tak segerak dalam LongProcess
selesai.
Sifat pelaksanaan tak segerak
Bertentangan dengan kepercayaan popular, kod tak segerak tidak dilaksanakan pada berbilang urutan. Sebaliknya, ia dilaksanakan pada benang, menggunakan teknik yang dipanggil "penukaran konteks."
Apabila fungsi tak segerak memanggil fungsi tak segerak yang lain, urutan semasa menangguhkan pelaksanaan pemanggil buat sementara waktu dan meneruskan pelaksanaan penerima. Sistem pengendalian kemudian memberikan benang yang digantung kepada tugas lain yang tersedia.
Walau bagaimanapun, sebaik sahaja pernyataan await
ditemui dalam penerima, urutan semasa kembali kepada pemanggil, dengan berkesan menyambung semula pelaksanaan pemanggil.
Langsungawait
Kelebihan kaedah tak segerak
Dalam senario yang diberikan, memandangkan LongProcess
sudah menjadi kaedah tak segerak, tidak perlu membungkusnya secara eksplisit await
sebelum Task.Run
nya. Kaedah tak segerak await
langsung membenarkan urutan mula melaksanakan tugas lain dengan segera sementara menunggu LongProcess
selesai.
Task.Run
senario penggunaan
Task.Run
mempunyai kes penggunaan khusus, contohnya:
Ringkasan
Dalam senario yang diberikan, kedua-dua kaedah adalah setara dari segi fungsi. Walau bagaimanapun, pendekatan langsung await
tak segerak adalah lebih baik kerana ia mengurangkan penukaran benang dan membolehkan penggunaan kumpulan benang yang lebih cekap.
Atas ialah kandungan terperinci Tunggu Tugasan. Jalankan lwn. Tunggu Async: Bilakah Anda Harus Pilih Yang Mana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!