Rumah >pembangunan bahagian belakang >C++ >Boleh selari.foreach berkesan menggunakan ekspresi lambda tak segerak?
Paralelisme dan Lambdas Asynchronous: Akta Pengimbangan
Pemprosesan selari dengan ketara meningkatkan prestasi dengan mengedarkan beban kerja merentasi pelbagai teras. Walau bagaimanapun, mengintegrasikan ekspresi lambda tak segerak dalam gelung selari memberikan cabaran yang unik.
Masalah: Tugas Hilang
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>
kerap kekal 0 kerana benang latar belakang count
tidak menunggu operasi tak segerak diselesaikan. Percubaan naif untuk membetulkannya: Parallel.ForEach
<code class="language-csharp">var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // Pre-processing var responseTask = GetData(item); responseTask.Wait(); var response = responseTask.Result; bag.Add(response); // Post-processing }); var count = bag.Count;</code>Walaupun ini memastikan penyelesaian tugas, ia menafikan kelebihan pengaturcaraan asynchronous dengan menyekat benang dan memerlukan pengendalian pengecualian manual.
Penyelesaian yang berkesan
untuk pemprosesan selari langsung dengan lambdas asynchronous:
<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;</code>Pendekatan ini mewujudkan tugas untuk setiap item, membolehkan pelaksanaan tidak segerak.
memastikan semua tugas selesai sebelum meneruskan. Task.WhenAll
menawarkan teknik canggih dan amalan terbaik. Ini memberikan penyelesaian yang lebih mantap dan cekap untuk mengendalikan operasi tak segerak dalam gelung selari. ForEachAsync
Atas ialah kandungan terperinci Boleh selari.foreach berkesan menggunakan ekspresi lambda tak segerak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!