Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya dapat menanti operasi tak segerak dengan betul dalam gelung selari.foreach di C#?

Bagaimanakah saya dapat menanti operasi tak segerak dengan betul dalam gelung selari.foreach di C#?

Susan Sarandon
Susan Sarandonasal
2025-02-01 03:21:08399semak imbas

How Can I Properly Await Asynchronous Operations within a Parallel.ForEach Loop in C#?

operasi asynchronous selari dengan dalam C#Parallel.ForEach

Meningkatkan prestasi aplikasi sering melibatkan pemprosesan selari. Walau bagaimanapun, menggabungkan operasi asynchronous (

/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

Kata kunci

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

Pertimbangkan contoh ini:

<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

Penyelesaian yang mantap melibatkan

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

Untuk senario yang lebih rumit, catatan blog Stephen Toub di

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!

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