Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh menggunakan fungsi lambda tak segerak dengan selari.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!