【问题标题】:Changing a foreach loop to a Parallel.ForEach loop将 foreach 循环更改为 Parallel.ForEach 循环
【发布时间】: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

标签: c# parallel.foreach


【解决方案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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多