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
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;
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;
memastikan semua tugas selesai sebelum meneruskan. Task.WhenAll
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!