我想从 Exchange 服务器(2010 通过 EWS API)检索信息。具体来说,我想构建一个 Windows 服务来遍历所有交换用户并使用非个性化索引他们的私人邮箱。效果很好,但是当我一个接一个地执行此操作时(取决于邮箱量和用户数量),它的速度非常慢。索引速度现在约为每分钟 500 个项目。
在我的测试系统上,以下调用大约需要 250 毫秒:
PropertySet myPropertySet = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.ParentFolderId);
myPropertySet.RequestedBodyType = BodyType.Text;
myPropertySet.Add(entryIdExtendedProperty);
Item item = Item.Bind(es, itemKey, myPropertySet);
所以我的想法是做一个并行化。到目前为止,我尝试了 3 种方法:
后台工作线程:每个用户一个工作线程。结果:没有效果。似乎这样做会减慢通话速度。总之,整体速度保持不变。
单独的 EXE 进程:每个用户一个 EXE。我创建了一个“Worker”-Exe 并以用户为参数调用它们:IndexWorker.exe -user1
结果:相同的结果!每个exe的调用都变慢了!单独的 Windows 服务:每个用户一项服务。结果:突然,请求并没有变慢,这意味着我可以将整体速度提高到每分钟 500 个项目的倍数(我最多尝试 3 个进程,即每分钟 1500 个项目)。不错,但我让我一个人回答这个问题:
为什么 EWS 呼叫在 1) 和 2) 中变慢,但在 3) 中没有?线程对我来说是最优雅的方式,我可以使用任何选项或设置吗?
我阅读了一些关于节流策略和 EWSFindCountLimit 的内容。这是正确的方向吗?