将 foreach 循环更改为 Parallel.ForEach 循环

     2023-05-07     106

关键词:

【中文标题】将 foreach 循环更改为 Parallel.ForEach 循环【英文标题】:Changing a foreach loop to a Parallel.ForEach loop 【发布时间】:2012-01-03 06:41:33 【问题描述】:

好的,这里是基本背景。该程序连接到 Outlook/Exchange 并解析所有邮件消息以查看哪些是加密的。我想做的一件事是使用多线程来减少扫描消息所需的时间。

目前代码如下:

foreach (Object item in folder.Items) 
//Checks for encryption and gets needed info and updates count

我想改用 Parallel.ForEach 函数。我想知道如何设置它。我尝试将表达式设置为现在的样子,但我收到一条错误消息,指出 Object 类型正在用作变量。对此的任何帮助将不胜感激。

好的,我得到的布局似乎是正确的。代码现在看起来像这样:

Parallel.ForEach(folder.Items, item =>

//does stuff
);

我现在收到以下错误:

错误 15 方法的类型参数 System.Threading.Tasks.Parallel.ForEach(System.Collections.Concurrent.OrderablePartitioner, System.Action)' 不能从用法中推断出来。尝试指定类型参数 明确的。

有什么想法吗?感谢您的帮助,不胜感激。

好的,我找到了这个网站:http://blogs.msdn.com/b/pfxteam/archive/2010/03/02/9971804.aspx,它给了我需要的错误答案。我只需要通过制作转换函数将集合更改为通用集合。

static IEnumerable<object> Cast(IEnumerable source)

    foreach (object o in source)
        yield return o;

然后将原图调整为

Parallel.ForEach(Cast(folder.Items), item =>

//does stuff
);

现在它运行没有错误。万岁。

【问题讨论】:

请发布您修改后的代码(给您错误消息的代码)。 编辑后:现在取决于folder.Items 和/或//does stuff 【参考方案1】:

类似这样的:

Parallel.For(0, folder.Items.Count - 1, delegate(int i)  
  object item = folder.Items[i];
);

或使用 ForEach:

Parallel.ForEach(folder.Items, item => whatever you want to do with item)

注意:folder.Items 必须实现 IEnumerable

【讨论】:

+1 还提到了实现 IEnumerable 的要求。 @ericj: 来自for(item in Items) ...【参考方案2】:

假设这是正确的

foreach (Object item in folder.Items)
   Process(item);

然后变成

Parallel.ForEach (folder.Items, item => Process(item));

【讨论】:

带有 BlockingCollection.GetConsumableEnumerable 的 Parallel.ForEach 循环

】带有BlockingCollection.GetConsumableEnumerable的Parallel.ForEach循环【英文标题】:Parallel.ForEachloopwithBlockingCollection.GetConsumableEnumerable【发布时间】:2011-09-3006:50:22【问题描述】:为什么Parallel.ForEach循环以OperationCancelledException退出 查看详情

Parallel.For(Foreach) 将创建多少个线程?默认 MaxDegreeOfParallelism?

】Parallel.For(Foreach)将创建多少个线程?默认MaxDegreeOfParallelism?【英文标题】:HowmanythreadsParallel.For(Foreach)willcreate?DefaultMaxDegreeOfParallelism?【发布时间】:2013-09-2710:21:33【问题描述】:我想知道,当我运行Parallel.For/ForEach循环时将... 查看详情

.Net 中的多个 Parallel.ForEach 循环

】.Net中的多个Parallel.ForEach循环【英文标题】:MultipleParallel.ForEachloopsin.Net【发布时间】:2021-05-2111:12:39【问题描述】:在.Net进程中,只有一个托管线程池。我们可以根据需要通过公共属性设置最小和最大线程数。在.Net中,我们... 查看详情

我在 Parallel.ForEach 循环中收到 TaskCanceledException,如何解决?

】我在Parallel.ForEach循环中收到TaskCanceledException,如何解决?【英文标题】:IamgettingaTaskCanceledExceptioninaParallel.ForEachloop,howtofixit?【发布时间】:2021-10-0611:57:20【问题描述】:我在C#中运行Parallel.ForEach。我低于TaskCanceledException:Ataskw... 查看详情

为啥覆盖 Parallel.foreach 循环的 .NET 单元测试依赖于硬件?

】为啥覆盖Parallel.foreach循环的.NET单元测试依赖于硬件?【英文标题】:Whyisa.NETunittestcoveringaParallel.foreachloophardware-dependent?为什么覆盖Parallel.foreach循环的.NET单元测试依赖于硬件?【发布时间】:2013-06-0100:31:54【问题描述】:我... 查看详情

c#的并发循环(for,foreach,parallel.for,parallel.foreach)对比(代码片段)

1.为了测试,我们创建一个10万条数据的集合1usingSystem.Collections.Generic;23namespaceParallelProcessing45classTestPerson67publicstringIDget;set;8publicstringNameget;set;910publicstringInterestget;set;11publicTes 查看详情

在 parallel.ForEach 循环中获取线程 ID

】在parallel.ForEach循环中获取线程ID【英文标题】:Getathreadidinsideparallel.ForEachloop【发布时间】:2015-11-2202:29:19【问题描述】:有没有办法在Parallel.FoEach循环中找到线程ID。我尝试使用varthreadId=Thread.CurrentThread.ManagedThreadId-1;,但它... 查看详情

在 parallel.foreach 循环中捕获的变量

】在parallel.foreach循环中捕获的变量【英文标题】:capturedvariablesinaparallel.foreachloop【发布时间】:2015-03-0418:04:43【问题描述】:每个线程是否都有自己可以更改的副本?他们都共享同一个吗?它是线程安全的吗?Xvar;Parallel.Foreach(... 查看详情

如何正确调用 Parallel.ForEach 循环中的调用异步方法[重复]

】如何正确调用Parallel.ForEach循环中的调用异步方法[重复]【英文标题】:howtocallCallAsyncMethodsinParallel.ForEachloopproperly[duplicate]【发布时间】:2020-09-0900:59:21【问题描述】:如何正确调用Parallel.ForEach循环中的调用异步方法。billDataSer... 查看详情

打破parallel.foreach?

】打破parallel.foreach?【英文标题】:Breakparallel.foreach?【发布时间】:2012-09-1606:25:53【问题描述】:如何跳出parallel.for循环?我有一个非常复杂的语句,如下所示:Parallel.ForEach<ColorIndexHolder>(ColorIndex.AsEnumerable(),newAction<Color... 查看详情

如何将此 foreach 代码转换为 Parallel.ForEach?

】如何将此foreach代码转换为Parallel.ForEach?【英文标题】:HowcanIconvertthisforeachcodetoParallel.ForEach?【发布时间】:2012-08-2810:16:05【问题描述】:我对@9​​87654322@有点困惑。Parallel.ForEach是什么,它到底有什么作用?请不要引用任何M... 查看详情

如何限制 Parallel.ForEach?

】如何限制Parallel.ForEach?【英文标题】:HowcanIlimitParallel.ForEach?【发布时间】:2012-03-0614:59:08【问题描述】:我有一个Parallel.ForEach()异步循环,我用它下载一些网页。我的带宽有限,因此我每次只能下载x页,但Parallel.ForEach会执... 查看详情

Parallel.Foreach + 收益回报?

】Parallel.Foreach+收益回报?【英文标题】:Parallel.Foreach+yieldreturn?【发布时间】:2012-01-1419:41:31【问题描述】:我想像这样使用并行循环来处理一些事情:publicvoidFillLogs(IEnumerable<IComputer>computers)Parallel.ForEach(computers,cpt=>cpt.Lo... 查看详情

Parallel.ForEach 中的不一致 [关闭]

】Parallel.ForEach中的不一致[关闭]【英文标题】:InconsistencyinParallel.ForEach[closed]【发布时间】:2017-01-1610:19:10【问题描述】:我正在使用Parallel.foreach进行超过500次迭代。我的循环是这样的:Parallel.ForEach(indexes,(index)=>//parentCreation... 查看详情

Parallel.ForEach 的不同求和结果

】Parallel.ForEach的不同求和结果【英文标题】:DifferentsummationresultswithParallel.ForEach【发布时间】:2010-07-2921:58:33【问题描述】:我有一个正在并行化的foreach循环,我注意到一些奇怪的东西。代码看起来像doublesum=0.0;Parallel.ForEach(myC... 查看详情

如何正确取消 Parallel.Foreach?

】如何正确取消Parallel.Foreach?【英文标题】:HowdoIproperlycancelParallel.Foreach?【发布时间】:2013-10-1817:12:18【问题描述】:我的代码看起来像这样:Parallel.Foreach(ItemSource(),(item)=>DoSomething(item));ItemSource()产生无限的项目流。我希望... 查看详情

试图将循环更改为递归方法。遇到一些麻烦

】试图将循环更改为递归方法。遇到一些麻烦【英文标题】:Tryingtochangealooptoarecursivemethod.Havingsometoruble【发布时间】:2022-01-1800:13:45【问题描述】:我需要在我的最终项目中加入递归。有人建议我简单地将我的一个循环更改为... 查看详情

Parallel.ForEach 具有可枚举的 KeyValuePairs?

】Parallel.ForEach具有可枚举的KeyValuePairs?【英文标题】:Parallel.ForEachwithEnumerableofKeyValuePairs?【发布时间】:2020-07-1913:37:34【问题描述】:我是否使用了错误的ParallelForEach重载方法?当我使用普通的ForEach循环时,我能够获取当前... 查看详情