IE可编号的普林克收益率

本文关键字:林克 收益率 编号 IE | 更新日期: 2023-09-27 18:36:00

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

IE可编号的普林克收益率

如果"通过 MAPI"指的是 Outlook 对象模型(在 VSTO 中可用),则不要使用线程处理(无论是通过 PLINQ 还是显式)。Outlook 对象模型将所有调用封送回主线程,使过程比直接从主线程本身运行它们的速度慢。

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

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

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

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

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

此方法接受许多现成的连接。 将启动 10 个线程,从每个连接平行拉取消息。 GetMessages是实际拉取消息的方法。