项目.限制退货重复的项目

问题描述 投票:1回答:1

当使用Items.Restrict时,我注意到它会多次返回包含每个项目的项目集。

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

我缺少什么?为什么前面提到的代码会返回重复的结果?

c# outlook office-interop
1个回答
2
投票

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

Outlook使用的是单线程公寓模型。你的所有调用都应该被Outlook调集到主线程,即使你试图使用它。所以,你永远不应该在二级线程上使用Outlook对象模型。相反,你可以考虑使用Outlook建立在其上的低级API--Extended MAPI,它允许运行多线程应用程序。或者直接使用任何围绕该API的第三方封装器,如Redemption。

© www.soinside.com 2019 - 2024. All rights reserved.