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
Barbara Streisandasal
2025-02-01 03:31:08993semak imbas

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

<code class="language-csharp">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</code>

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

<code class="language-csharp">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;</code>

Penyelesaian Menggunakan Task.Whenall

Penyelesaian yang lebih efisien melibatkan memanfaatkan

untuk menguruskan operasi tak segerak: Task.WhenAll

<code class="language-csharp">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</code>
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:
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