Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya dapat menanti operasi tak segerak dengan betul dalam gelung selari.foreach di C#?
operasi asynchronous selari dengan dalam C#Parallel.ForEach
/async
) dengan gelung selari seperti await
membentangkan cabaran yang unik. Artikel ini menangani cabaran -cabaran ini dan menyediakan penyelesaian untuk menanti tugas -tugas yang tidak segerak dalam gelung selari. Parallel.ForEach
Masalah: Tugas Asynchronous dan Parallel.ForEach
dalam C# membolehkan pengaturcaraan asynchronous, mengembalikan objek async
. Masalahnya timbul apabila menggunakan kaedah Task
dalam async
kerana benang latar belakang tidak semestinya menunggu tugas -tugas asynchronous untuk selesai sebelum gelung selesai. Parallel.ForEach
<code class="language-csharp">var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // Pre-processing var response = await GetData(item); bag.Add(response); // Post-processing }); var count = bag.Count; // count is often 0!</code>
sering mengembalikan 0 kerana benang utama diteruskan sebelum benang latar belakang menyelesaikan operasi asynchronous mereka. count
Penyelesaian: Menggunakan dan Select
Task.WhenAll
untuk membuat koleksi Select
objek dan Task
untuk menunggu semua tugas selesai: Task.WhenAll
<code class="language-csharp">var bag = new ConcurrentBag<object>(); var tasks = myCollection.Select(async item => { // Pre-processing var response = await GetData(item); bag.Add(response); // Post-processing }); await Task.WhenAll(tasks); var count = bag.Count; // count will be correct</code>Pendekatan ini memulakan operasi tak segerak secara serentak menggunakan
dan kemudian menggunakan Select
untuk memastikan semua tugas selesai sebelum mengakses Task.WhenAll
. bag
Penyelesaian Lanjutan: ForEachAsync
menyediakan penyelesaian yang lebih canggih dan boleh disesuaikan: ForEachAsync
https://www.php.cn/link/33edf41c0becd0d57c35c4e27276617b
Ini menawarkan kaedah yang lebih terkawal dan cekap untuk mengendalikan operasi asynchronous selari, terutamanya apabila berurusan dengan potensi pengecualian atau pembatalan. Ia memberikan pendekatan yang lebih mantap dan fleksibel berbanding dengan kaedah/Select
mudah. Task.WhenAll
Atas ialah kandungan terperinci Bagaimanakah saya dapat menanti operasi tak segerak dengan betul dalam gelung selari.foreach di C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!