Pengaturcaraan tak segerak selalunya melibatkan await
dan Task.Run
, yang membawa kepada kemungkinan kekeliruan. Artikel ini menjelaskan perbezaan mereka melalui contoh khusus.
Mari kita analisa coretan kod ini:
<code class="language-csharp">await Task.Run(() => LongProcess());</code>
<code class="language-csharp">await LongProcess();</code>
LongProcess
ialah kaedah tak segerak melaksanakan berbilang panggilan pangkalan data menggunakan await ExecuteReaderAsync()
.
Adalah penting untuk menjelaskan bahawa async
/await
sememangnya tidak mencipta berbilang urutan. Satu benang mengendalikan segala-galanya.
Async
/await
membenarkan urutan untuk melaksanakan tugas lain sementara menunggu operasi tak segerak. Bayangkan seorang chef melakukan pelbagai tugas antara memotong sayur-sayuran dan memeriksa ketuhar; benang juga bertukar antara tugas sehingga ia menemui await
, meneruskan pelaksanaan selepas itu.
Task.Run
adalah berharga apabila melancarkan operasi tak segerak tanpa segera menunggu penyiapannya. Ini berfaedah apabila mengekalkan tindak balas benang untuk input pengguna atau tugas lain semasa operasi tak segerak berjalan.
Dalam contoh ini, kedua-dua pendekatan menghasilkan keputusan yang sama. await Task.Run(...)
melaksanakan operasi tak segerak pada urutan berasingan yang diuruskan oleh Task.Run
. Walau bagaimanapun, urutan semasa masih menunggu untuk disiapkan, menjadikannya setara secara fungsi dengan menunggu terus LongProcess
.
Menguasai nuansa async
/await
adalah penting untuk pengaturcaraan tak segerak yang cekap. Dalam kes khusus ini, kedua-dua await Task.Run(...)
dan await
mencapai hasil yang sama. Pilihan optimum bergantung pada sama ada mengekalkan tindak balas benang semasa semasa operasi tak segerak adalah perlu.
Atas ialah kandungan terperinci Tunggu Task.Run(() => ...) vs. Await LongProcess(): Bilakah Anda Harus Menggunakan Setiap?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!