我有一个返回IEnumerable的函数,它通过MAPI迭代收件箱中的对象,但它相对较慢,所以我将创建一个连接池,并以多线程的方式使用它们。有可能在数以千计的廉价线程中使用PLINQ吗?
发布于 2012-06-02 03:45:43
如果“通过MAPI”指的是Outlook对象模型(在VSTO中可用),则不要使用线程(无论是通过PLINQ还是显式)。Outlook对象模型将所有调用封送回主线程,这使得该过程比直接从主线程本身运行它们要慢。
来自Selecting an API or Technology for Developing Outlook Solutions
对Outlook对象模型和PIA的所有调用都在Outlook的主前台线程上执行。Outlook对象模型支持的唯一线程模型是单线程单元(STA)。不支持从后台线程调用Outlook对象模型或PIA,这可能会导致解决方案出现错误和意外结果。
如果你想使用托管代码多线程访问MAPI,你最好的选择是Redemption库(商业第三方解决方案)。
发布于 2012-06-02 05:54:34
这是针对您的任务的PLINQ解决方案的想法:
public IEnumerable<IMessage> GetMessagesParallel(IEnumerable<IConnection> connections)
{
return connections
.AsParallel()
.WithDegreeOfParallelism(10)
.SelectMany(connection => GetMessages(connection));
}此方法接受多个可供使用的连接。10个线程将开始从每个连接并行拉取消息。GetMessages是实际拉取消息的方法。
https://stackoverflow.com/questions/10856371
复制相似问题