我有一个返回IEnumerable的函数,它通过MAPI迭代Inbox中的对象,但它相对较慢,所以我将创建一个连接池并以多线程方式使用它们。是否有可能在成千上万的廉价线程中使用PLINQ?
答案 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
是实际提取消息的方法。