0

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

4

2 回答 2

2

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

选择用于开发 Outlook 解决方案的 API 或技术

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

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

于 2012-06-01T19:45:42.917 回答
0

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

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

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

于 2012-06-01T21:54:33.627 回答