Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah saya boleh menggunakan fungsi lambda tak segerak dengan selari.foreach?

Bagaimanakah saya boleh menggunakan fungsi lambda tak segerak dengan selari.foreach?

Barbara Streisand
Lepaskan: 2025-02-01 03:31:08
asal
1043 orang telah melayarinya

How Can I Properly Use Asynchronous Lambda Functions with Parallel.ForEach?

pemprosesan selari dengan fungsi lambda asynchronous

Menggabungkan pemprosesan selari dan fungsi lambda asynchronous memerlukan pertimbangan yang teliti. Artikel ini menangani cabaran menggunakan kaedah

dalam async dan menawarkan penyelesaian yang berkesan. Parallel.ForEach

Masalah dengan paralel.foreach dan async lambdas

Melancarkan benang latar belakang yang tidak semestinya menunggu penyelesaian tugas. Ini menimbulkan masalah apabila menggunakan Parallel.ForEach di dalam ekspresi lambda. Contoh berikut menggambarkan isu ini: await

var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // some pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // some post-processing
});
var count = bag.Count; // count will be 0
Salin selepas log masuk

akan menjadi 0 kerana benang utama berterusan pelaksanaan sebelum benang latar belakang menyelesaikan operasi asynchronous mereka. Menggunakan count sebagai penyelesaian, seperti yang ditunjukkan di bawah, menafikan manfaat Wait() dan memerlukan pengendalian pengecualian yang jelas: await

var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, item =>
{
  // some pre-processing
  var responseTask = GetData(item);
  responseTask.Wait();
  var response = responseTask.Result;
  bag.Add(response);
  // some post-processing
});
var count = bag.Count;
Salin selepas log masuk

Penyelesaian Menggunakan Task.Whenall

Penyelesaian yang lebih efisien melibatkan memanfaatkan

untuk menguruskan operasi tak segerak: Task.WhenAll

var bag = new ConcurrentBag<object>();
var tasks = myCollection.Select(async item =>
{
  // some pre-processing
  var response = await GetData(item);
  bag.Add(response);
  // some post-processing
});
await Task.WhenAll(tasks);
var count = bag.Count; // count will be correct
Salin selepas log masuk
Pendekatan ini membolehkan setiap item diproses secara asynchronously, dan

memastikan semua tugas selesai sebelum meneruskan. Task.WhenAll

Penyelesaian Lanjutan: Foreachasync

Untuk pemprosesan selari asynchronous yang lebih canggih, terokai catatan blog Stephen Toub pada

. Ini menyediakan penyelesaian yang mantap dan fleksibel untuk mengendalikan senario kompleks. ForEachAsync

Atas ialah kandungan terperinci Bagaimanakah saya boleh menggunakan fungsi lambda tak segerak dengan selari.foreach?. 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