Items.Restrict returns 项重复项

Items.Restrict returns duplicate items

当使用 Items.Restrict 时,我注意到它 return 是一组包含每个项目多次的项目:

MAPIFolder sentFolder = _nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderSentMail);
DateTime sentDate = DateTime.Now.AddDays(-14).Date;
var filter = $"[SentOn] >= '{sentDate:d}'";
Console.WriteLine($"Filter {filter}");
Items items = sentFolder.Items.Restrict(filter);
foreach (MailItem mailItem in items)
{
    Console.WriteLine($"'{mailItem.Subject}'/{mailItem.SentOn}");
}

输出例如:

Filter [SentOn] >= '28.04.2020'
'Test-Mail'/11.05.2020 10:09:05
'Test-Mail'/11.05.2020 10:09:05
... repeat about 10 times ...

上面的代码是从单独线程中的 WPF 应用程序调用的。

我编写了一个控制台应用程序,其功能完全相同:

var application = new Application();
var ns = application.GetNamespace("MAPI");
var folder = ns.GetDefaultFolder(OlDefaultFolders.olFolderSentMail);
var filter = "[SentOn] >= '28.04.2020'";
Console.WriteLine($"Filter " + filter);
Items items = folder.Items.Restrict(filter);
foreach (MailItem item in items)
{
    Console.WriteLine($"'{item.Subject}'/{item.SentOn}");
}

输出为(在同一台机器上执行):

Filter [SentOn] >= '28.04.2020'
'Test-Mail'/11.05.2020 10:09:05
'Test-Mail 2'/11.05.2020 11:05:34

我错过了什么?为什么前面提到的代码 return 重复结果?

The code above is called from a WPF application in a separate Thread.

Outlook 使用单线程单元模型。即使您尝试使用它,您的所有调用都应该由 Outlook 编组到主线程。因此,您永远不应在辅助线程上使用 Outlook 对象模型。相反,您可以考虑使用构建 Outlook 的低级别 API - Extended MAPI,它允许 运行 多线程应用程序。或者只使用任何围绕 API 的第三方包装器,例如 Redemption。