Tag: parallel.foreach

如何从Parallel.ForEach收集返回值?

我正在调用一个缓慢的web服务并行。 事情很棒,直到我意识到我需要从服务中获得一些信息。 但是我不知道从哪里得到价值。 我不能写入数据库,HttpContext.Current似乎是一个使用Parallel.ForEach调用的方法 下面是一个示例程序(在你的脑海中,请想象一个缓慢的Web服务,而不是string连接) using System; using System.Threading.Tasks; class Program { static void Main(string[] args) { WordMaker m = new WordMaker(); m.MakeIt(); } public class WordMaker { public void MakeIt() { string[] words = { "ack", "ook" }; ParallelLoopResult result = Parallel.ForEach(words, word => AddB(word)); Console.WriteLine("Where did my results go?"); Console.ReadKey(); } public string […]

MaxDegreeOfParallelism做什么?

我正在使用Parallel.ForEach,我正在做一些数据库更新,现在没有设置MaxDegreeOfParallelism,一个双核心处理器机器导致SQL客户端超时,其他四核心处理器机器不知何故超时。 现在,我无法控制运行代码的处理器内核的types,但是有些设置可以通过MaxDegreeOfParallelism更改,这样可能会同时运行更less的操作,并且不会导致超时? 我可以增加超时,但它不是一个好的解决scheme,如果在较低的CPU上,我可以同时处理较less的操作,这将减less对CPU的负载。 好吧,我也读过所有其他post和MSDN,但将MaxDegreeOfParallelism设置为较低的值,使我的四核心机器遭受? 例如,有没有办法做,如果CPU有两个核心,那么使用20,如果CPU有四个核心,然后40?

与asynchronouslambda平行的foreach

我想同时处理一个集合,但是我在执行时遇到了麻烦,所以我希望得到一些帮助。 如果我想在并行循环的lambda中调用C#中标记为asynchronous的方法,则会出现问题。 例如: var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // some pre stuff var response = await GetData(item); bag.Add(response); // some post stuff } var count = bag.Count; 问题发生在count为0时,因为所有创build的线程都只是后台线程,并且Parallel.ForEach调用不会等待完成。 如果我删除了async关键字,方法如下所示: var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // some pre stuff var responseTask = await GetData(item); responseTask.Wait(); var response […]

打破parallel.foreach?

我如何摆脱parallel.for循环? 我有一个非常复杂的声明,如下所示: Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(), new Action<ColorIndexHolder>((ColorIndexHolder Element) => { if (Element.StartIndex <= I && Element.StartIndex + Element.Length >= I) { Found = true; break; } })); 使用并行类,我可以优化这个过程。 然而; 我无法弄清楚如何打破并行循环? break; 语句抛出以下语法错误: 没有封闭的环路可以打破或继续

嵌套在Parallel.ForEach中等待

在metro应用程序中,我需要执行一些WCF调用。 有大量的电话要做,所以我需要做一个并行循环。 问题是并行循环在WCF调用全部完成之前退出。 你将如何重构这个按预期工作? var ids = new List<string>() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; var customers = new System.Collections.Concurrent.BlockingCollection<Customer>(); Parallel.ForEach(ids, async i => { ICustomerRepo repo = new CustomerRepo(); var cust = await repo.GetCustomer(i); customers.Add(cust); }); foreach ( var customer in customers ) { Console.WriteLine(customer.ID); } Console.ReadKey();

Parallel.ForEach()与foreach(IEnumerable <T> .AsParallel())

呃,我试图find使用reflection器BCL这两个方法,但无法find它们。 这两个片段有什么区别? A: IEnumerable<string> items = … Parallel.ForEach(items, item => { … }); B: IEnumerable<string> items = … foreach (var item in items.AsParallel()) { … } 使用另一个有不同的后果吗? (假设我在两个例子的括号内都是线程安全的。)

我怎样才能限制Parallel.ForEach?

我有一个Parallel.ForEach()asynchronous循环,我下载了一些网页。 我的带宽是有限的,所以我可以每次只下载x页,但是Parallel.ForEach执行所需网页的整个列表。 有没有办法在运行Parallel.ForEach时限制线程数或其他限制器? 演示代码: Parallel.ForEach(listOfWebpages, webpage => { Download(webpage); }); 真正的任务与网页无关,所以创造性的网页爬行解决scheme将无济于事。

Parallel.ForEach与Task.Run和Task.WhenAll

使用Parallel.ForEach或Task.Run()asynchronous启动一组任务之间有什么区别? 版本1: List<string> strings = new List<string> { "s1", "s2", "s3" }; Parallel.ForEach(strings, s => { DoSomething(s); }); 版本2: List<string> strings = new List<string> { "s1", "s2", "s3" }; List<Task> Tasks = new List<Task>(); foreach (var s in strings) { Tasks.Add(Task.Run(() => DoSomething(s))); } await Task.WhenAll(Tasks);

何时使用Parallel.ForEach循环而不是常规的foreach?

我对Parallel.ForEach有些困惑。 什么是Parallel.ForEach ,它究竟干什么? 请不要参考任何MSDN链接。 这是一个简单的例子: string[] lines = File.ReadAllLines(txtProxyListPath.Text); List<string> list_lines = new List<string>(lines); foreach (string line in list_lines) { //My Stuff } 我如何用Parallel.ForEach重写这个例子?