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

本文关键字:循环 Parallel ForEach foreach | 更新日期: 2023-09-27 18:15:24

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

当前代码是这样的:

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

我想利用并行。代替ForEach函数。我在想我该怎么安排。我尝试将表达式设置为现在的样子,但我得到一个错误,指出对象类型被用作变量。如有任何帮助,我将不胜感激。

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

Parallel.ForEach(folder.Items, item =>
{
//does stuff
});

我现在得到以下错误:

错误15方法的类型参数System.Threading.Tasks.Parallel.ForEach (System.Collections.Concurrent.OrderablePartitionerSystem.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
});

现在它运行没有错误。华友世纪。

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

像这样:

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})

注意:文件夹。Items必须实现IEnumerable

假设这是正确的

foreach (Object item in folder.Items)
   Process(item);
然后变成
Parallel.ForEach (folder.Items, item => Process(item));