IEnumerable PLINQ产量

时间:2012-06-01 19:40:20

标签: c# ienumerable plinq

我有一个返回IEnumerable的函数,它通过MAPI迭代Inbox中的对象,但它相对较慢,所以我将创建一个连接池并以多线程方式使用它们。是否有可能在成千上万的廉价线程中使用PLINQ?

2 个答案:

答案 0 :(得分:2)

如果通过“通过MAPI”,您指的是Outlook对象模型(在VSTO中可用),则不要使用线程(无论是通过PLINQ还是显式)。 Outlook对象模型将所有调用重新编组回主线程,使得进程比直接从主线程本身运行它们要慢。

来自Selecting an API or Technology for Developing Outlook Solutions

  

所有对Outlook对象模型和PIA的调用都在Outlook的主要前台线程上执行。 Outlook对象模型支持的唯一线程模型是单线程单元(STA)。不支持从后台线程调用Outlook对象模型或PIA,这可能会导致解决方案中出现错误和意外结果。

如果您想使用托管代码对MAPI进行多线程访问,最好的选择是Redemption库(商业第三方解决方案)。

答案 1 :(得分:0)

这是针对您的任务的PLINQ解决方案的想法:

public IEnumerable<IMessage> GetMessagesParallel(IEnumerable<IConnection> connections)
{
    return connections
        .AsParallel()
        .WithDegreeOfParallelism(10)
        .SelectMany(connection => GetMessages(connection));
}

此方法接受许多即用型连接。将开始10个线程从每个连接中拉取消息。 GetMessages是实际提取消息的方法。