Rumah >pembangunan bahagian belakang >C++ >Boleh selari.foreach berkesan menggunakan ekspresi lambda tak segerak?

Boleh selari.foreach berkesan menggunakan ekspresi lambda tak segerak?

Linda Hamilton
Linda Hamiltonasal
2025-02-01 03:26:09567semak imbas

Can Parallel.ForEach Effectively Utilize Asynchronous Lambda Expressions?

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

Untuk senario yang lebih rumit, catatan blog Stephen Toub di

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!

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