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
Lepaskan: 2025-02-01 03:26:09
asal
591 orang telah melayarinya

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:

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
Salin selepas log masuk

kerap kekal 0 kerana benang latar belakang count tidak menunggu operasi tak segerak diselesaikan. Percubaan naif untuk membetulkannya: Parallel.ForEach

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;
Salin selepas log masuk
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:

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;
Salin selepas log masuk
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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan