嵌套的Parallel.ForEach循环
我有一些代码,我目前正在优化多项架构中的并发性.在我的一个课程中,我找到了一个嵌套的foreach循环.基本上,外循环通过NetworkInterface对象的数组迭代.内部循环通过网络接口IP地址迭代. 它让我想到,嵌套Parallel.ForEach循环一定是一个好主意吗?阅读本文后( nested Parallel.在同一列表上添加循环吗?)我仍然不确定在效率和并行设计方面适用的地方.此示例将大约应用于两个循环在该列表上执行操作的列表. 在我的示例中,循环正在做不同的事情,所以我应该: 使用嵌套Parallel.ForEach循环? 在父循环上使用Parallel.ForEach,然后将内部循环as-is? 解决方案 平行.foreach不一定是并行执行的 - 如果可能的话,这只是一个请求.因此,如果执行环境没有并行执行循环的CPU幂,则不会这样做. 如果循环中的动作无关(即,如果它们是分开的,并且不影响彼此),我认为使用并行的情况下没有问题.
2 2023-05-23
编程技术问答社区
Parallel.ForEach 比ForEach慢一些
这是代码: using (var context = new AventureWorksDataContext()) { IEnumerable _customerQuery = from c in context.Customers where c.FirstName.StartsWith("A") select c; var watch = new Stopwatch(); watch.Start(); var result = Parallel.ForEach(_customerQuery, c => Console.WriteLine(c.FirstName)); watch.Stop(); Debug.WriteLine(watc
2 2023-05-23
编程技术问答社区
如何使用Parallel.ForEach与dataTable?
我如何使用DataTable使用列表和数组可以正常工作,但是我无法与DataTable一起使用它显示错误"无法从用法中推断出"无法从用法中推断出来.尝试明确指定类型参数" Parallel.ForEach(dt.Rows , row=> { //code here }); 解决方案 答案是您需要使用Asenumerable()扩展方法进行行: Parallel.ForEach(dt.Rows.AsEnumerable() , row=> { //code here });
2 2023-05-19
编程技术问答社区
包含异步和同步的平行循环
我有一个循环需要并行运行,因为每次迭代都很慢,而且处理器密集型,但是我还需要将异步方法称为循环中每种迭代的一部分. 我已经看到了有关如何处理循环中的异步方法的问题,而不是异步和同步的组合,这是我所拥有的. 我(简化的)代码如下 - 我知道由于将异步操作传递给foreach. protected IDictionary GetReportData() { var results = new ConcurrentDictionary(); Parallel.ForEach(requestData, async data => { // process data synchronously var processedData = ProcessData(data); // get some data async
0 2023-05-19
编程技术问答社区
与并行获取目录
我有一种在目录上递归并建造树的方法: public void RecurseFolders(TreeNode mainNode) { DirectoryInfo nodeDir = new DirectoryInfo(mainNode.Tag.ToString()); try { foreach (var dir in nodeDir.GetDirectories()) { int index = GetSystemIcon(dir.FullName, treeView1.ImageList, false); var subNode = new TreeNode(dir.Name, index, index); subNode.Tag = dir.FullName; mainNode.Nodes.Add(subNode); RecurseFolders(subNode); } } catch (
0 2023-05-19
编程技术问答社区
并行Foreach竞赛条件
我有一个并行的问题,要在连接完成之前关闭连接.当我有常规的foreach loop runnung时,这很慢,但会返回所有内容.一旦我更改为平行的foreach,现在将返回大约95%的数据并终止. 以下是我使用的代码: var USPostalCodes = repository.GetUSPostalCodes(); var CAPostalCodes = repository.GetCAPostalCodes(); Parallel.ForEach(spreadsheetinfo, location => { LocationData Locationdata = new LocationData() { id = location.Id,
0 2023-05-19
编程技术问答社区
如何指定在Parallel.ForEach中执行的并行任务的数量?
我有〜500个任务,每个任务都需要约5秒钟,在等待远程资源回复时浪费了大多数时间.我想定义应(测试之后)应该产生的线程数,并在这些线程上运行任务.当一个任务完成时,我想在线程上产生另一个任务. 我找到了System.Threading.Tasks最容易实现我想要的东西,但是我认为不可能指定应该并行执行的任务数量.对于我的机器,它总是大约8(Quad Core CPU).是否有可能以某种方式并行执行多少个任务?如果不是,那么最简单的方法是实现我想要的? (我尝试了线程,但是代码更为复杂).我尝试增加MaxDegreeOfParallelism参数,但这仅限制了最大数字,所以这里没有运气... 这是我当前拥有的代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Con
0 2023-05-19
编程技术问答社区
并行.
我正在尝试在Priority Queue上运行Parallel.ForEach,但是我会收到以下错误: 严重性代码描述项目文件行抑制状态 错误cs0411方法" Parallel.Foreach(订购分类器,并行访问),操作)的类型参数'无法从用法中推断出来.尝试明确指定类型参数. tpl_poc.pl 我知道如何使用IEnumerable和List s执行Parallel.ForEach,但是以下没有运气. private void ProcessTasksParallely() { PriorityQueue activeTasksPriority = new PriorityQueue(); foreach (var task in this.tasks) { activeTasksPriority.Enqueue(task.Task, task.Id); }
6 2023-05-19
编程技术问答社区
使用Parallel.Foreach(多个线程)从列表中获取总和到值的元素数组
我正在使用以下代码来从列表中获取总和到值的元素.但是,它仅使用1个CPU.我的PC有64个内核,因此我想使用100%CPU加快过程,因此您可以帮助我更新代码以使用Parallel.ForEach(多个线程)? ? using System; using System.Collections.Generic; using System.Linq; IEnumerable> subset_sum(IEnumerable numbers, int target, IEnumerable partial = null, int partial_sum = 0) { partial ??= Enumerable.Empty(); if (partial_sum == target) yield return partial.ToList(); if (partial_sum >= target) yield
8 2023-05-19
编程技术问答社区
R:获取一个给定函数中所有变量和函数的列表和环境(用于并行处理)。
我正在使用foreach进行并行处理,这需要通过列表手动传递函数传递到地址内核的环境.我想自动化此过程并涵盖所有用例.简单的功能容易仅使用封闭变量.但是,并发症一旦要平行处理的函数就使用了在另一个环境中定义的参数和变量.考虑以下情况: global.variable
0 2023-05-19
编程技术问答社区
Parallel.ForEach比正常foreach慢
我正在使用Parallel.Foreach在C#控制台应用程序中进行播放,但似乎无法正确处理.我正在创建一个带有随机数的数组,并且我有一个顺序的foreach和一个并行.在C ++中的大约相同代码的情况下,我开始看到一个权衡,以在数组中使用几个线程.但是平行.即使在100m值下,foreach的速度也是两倍.我在做什么错? class Program { static void Main(string[] args) { dostuff(); } static void dostuff() { Console.WriteLine("How large do you want the array to be?"); int size = int.Parse(Console.ReadLine()); int[] arr = new int[size]; Random r
10 2023-05-19
编程技术问答社区
java 8并行流问题
_logger.info("data size : "+saleData.size); saleData.parallelStream().forEach(data -> { SaleAggrData saleAggrData = new SaleAggrData() { { setCatId(data.getCatId()); setRevenue(RoundUpUtil.roundUpDouble(data.getRevenue())); setMargin(RoundUpUtil.roundUpDouble(data.getMargin())); setUnits(data.getUnits());
0 2023-05-19
编程技术问答社区
C# 并行-将项目添加到正在迭代的集合中,或者等同于?
现在,我有一个C#程序,可以以反复出现的基础执行以下步骤: 从数据库中获取当前任务列表 使用Parallel.Foreach(),为每个任务工作 但是,其中一些任务非常长.这延迟了其他待处理任务的处理,因为我们只在程序开始时寻找新任务. 现在,我知道修改集合的迭代不可能(对吗?),但是在C#并行框架中是否有一些等效的功能,可以使我可以将工作添加到列表中,同时还可以处理该项目.列表? 解决方案 一般而言,您是对的,在不允许迭代时修改集合时,您是对的.但是您还可以使用其他方法: 使用 ActionBlock .代码看起来像: var actionBlock = new ActionBlock( task => DoWorkForTask(task), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = DataflowBlockOptions.U
0 2023-05-19
编程技术问答社区
C# Parallel.Foreach等同于Python
我有96个TXT文件必须处理.现在,我正在使用一个用于循环,并且一次使用它们,此过程非常慢.由此产生的96个文件,不需要合并.有没有一种方法可以使它们并行运行,Ala并行运行. 当前代码: for src_name in glob.glob(source_dir+'/*.txt'): outfile = open (...) with open(...) as infile: for line in infile: --PROCESS-- for --condition--: outfile.write(...) infile.close() outfile.close() 希望此过程与source_dir中的所有文件并行运行. 解决方案 假设限制因素确实是处理,而不是I/O,您可以使用 a 他们的文档中的简单示例: >>> from math import sqrt >>> from job
2 2023-05-19
编程技术问答社区
Task.StartNew() vs Parallel.ForEach : 多重网络请求场景
我已经阅读了SO中的所有相关问题,但是对我的场景的最佳方法有些困惑. 我有一个聚合器服务,该服务将输入,解析并将其转换为多个Web请求,使Web请求调用(无关,因此可以并行触发),并合并发送回呼叫者的响应.现在使用以下代码 - list.ForEach((object obj) => { tasks.Add(Task.Factory.StartNew((object state) => { this.ProcessRequest(obj); }, obj, CancellationToken.None, TaskCreationOptions.AttachedToParent, TaskScheduler.Default)); }); await Task.WhenAll(tasks); await Task.WhenAll(tasks)来自斯科特·汉塞尔曼(Scott Hanselman)的 "从可伸缩性
Parallel.Foreach开始用Invoke进行空转
我对Parallel.Foreach循环有问题.它的工作原理,只要我不调用一种方法来增加父级GUI程序的进度键价值即可. 其中KeinPapierVersand是一个简单的List对象,而EinzelnachweisDruckDatum是DateTime. Parallel.ForEach(KeinPapierVersand, partner => { generate_PCL_nachweis(partner, EinzelnachweisDruckDatum, true, false); generate_BGF_Report(partner, EinzelnachweisDruckDatum, false); //If the following line is uncommented, the loop starts to idle after about 200 // processed Items and will neve
0 2023-05-19
编程技术问答社区
Parallel.Foreach c# 暂停和停止功能?
暂停和停止(结束之前)并行的最有效方法是什么?foreach? Parallel.ForEach(list, (item) => { doStuff(item); }); 解决方案 damien_the_unbeliver 有一个很好的方法,但这只有在您想拥有一些外部进程停止的情况下,环形.如果要使循环突破,例如在正常for或foreach中使用break,则需要使用超载具有功能Stop()将停止处理元素在系统最早的方便下,这意味着可以在您致电stop()后可以执行更多的迭代,并且不能保证元素之前出现的元素您停下来甚至开始处理. 函数Break()执行与Stop()完全相同,但是它还将评估您称为Break() on之前的IEnumerable的所有元素.这对于当您不在乎处理元素的顺序时很有用,但是您必须处理所有元素直到停止的点. 检查从foreach可以查看foreach是否提早停止,如果您使用Break(),它处理过的最低项目是什么. Parall
6 2023-05-19
编程技术问答社区
在一些.NET Parallel.ForEach()代码中做一些async/await可以吗?
给定以下代码, ok 在Parallel.ForEach>? 中做async/await 例如 Parallel.ForEach(names, name => { // Do some stuff... var foo = await GetStuffFrom3rdPartyAsync(name); // Do some more stuff, with the foo. }); 或者有一些我需要知道的陷阱? 编辑:不知道这是否编译,顺便说一句.只是pseduo代码..大声思考 解决方案 不,将async与Paralell.Foreach组合是没有意义的. 考虑以下示例: private void DoSomething() { var names = Enumerable.Range(0,10).Select(x=> "Somename" + x); Parallel.ForEach(names, as
0 2023-05-19
编程技术问答社区
C# 从庞大的URL列表中下载数据
我有一个大量的网页列表,这些网页显示状态,我需要检查. 某些URL在同一站点内,另一组位于另一个站点上. 现在,我正在尝试通过使用下面的代码以平行的方式进行此操作,但是我觉得自己造成了太多的开销. while(ListOfUrls.Count > 0){ Parallel.ForEach(ListOfUrls, url => { WebClient webClient = new WebClient(); webClient.DownloadString(url); ... run my checks here.. }); ListOfUrls = GetNewUrls..... } 这可以用较少的开销来完成,并且对我使用/重复使用多少网络电量和连接的更多控制权?那么,最终可以更快地完成工作吗? 解决方案 Parallel.ForEach非常适合CPU结合的计算任务,但是在您的情况下,它将不必要的块池线程(如Downlo
0 2023-05-19
编程技术问答社区
在执行Parallel.ForEach的过程中,是否可以改变parallelOptions.MaxDegreeOfParallelism?
我正在运行一个多线程循环: protected ParallelOptions parallelOptions = new ParallelOptions(); parallelOptions.MaxDegreeOfParallelism = 2; Parallel.ForEach(items, parallelOptions, item => { // Loop code here }); 我想在执行并行循环执行期间更改parallelOptions.MaxDegreeOfParallelism,以减少或增加许多线程. parallelOptions.MaxDegreeOfParallelism = 5; 它似乎不会增加线程.有人有任何想法吗? 解决方案 即使尝试这样做的问题是这是一个困难的问题.对于初学者,您甚至如何可靠地观察CPU和磁盘利用率?不经常对CPU进行采样会给实际发生的事情提供糟糕的描述,并且采样磁盘利用更加困难.其次,您的任务的粒度