जैसा कि @ श्रीराम सक्थिवेल द्वारा इंगित किया गया है, Parallel.ForEach
का उपयोग एसिंक्रोनस लैम्बडास के साथ करने में कुछ समस्याएं हैं। स्टीवन टब का ForEachASync
बराबर कर सकता है। उन्होंने कहा कि यह here बारे में बात करती है, लेकिन यहां कोड है:
public static class Extensions
{
public static Task ForEachAsync<T>(this IEnumerable<T> source, int dop, Func<T, Task> body)
{
return Task.WhenAll(
from partition in Partitioner.Create(source).GetPartitions(dop)
select Task.Run(async delegate {
using (partition) while (partition.MoveNext()) await body(partition.Current);
}));
}
}
यह एक लोड संतुलन विभाजक (doco) बनाने के लिए Partitioner
वर्ग का उपयोग करता है, और आप कितने धागे आप dop
पैरामीटर के साथ चलाना चाहते हैं निर्दिष्ट कर सकते हैं । इसके बीच अंतर और Parallel.ForEach
के बीच अंतर देखने के लिए। निम्नलिखित कोड आज़माएं।
class Program
{
public static async Task GetStuffParallelForEach()
{
var data = Enumerable.Range(1, 10);
Parallel.ForEach(data, async i =>
{
await Task.Delay(1000 * i);
Console.WriteLine(i);
});
}
public static async Task GetStuffForEachAsync()
{
var data = Enumerable.Range(1, 10);
await data.ForEachAsync(5, async i =>
{
await Task.Delay(1000 * i);
Console.WriteLine(i);
});
}
static void Main(string[] args)
{
//GetStuffParallelForEach().Wait(); // Finished printed before work is complete
GetStuffForEachAsync().Wait(); // Finished printed after all work is done
Console.WriteLine("Finished");
Console.ReadLine();
}
अगर आप GetStuffForEachAsync
चलाने कार्यक्रम इंतजार कर रहा है सब काम खत्म करने के लिए के लिए। यदि आप GetStuffParallelForEach
चलाते हैं, तो कार्य समाप्त होने से पहले Finished
पंक्ति मुद्रित की जाएगी।
स्रोत
2014-05-19 05:07:57
कि संकलित करता है? –