我正在使用Outlook加载项,我有一个允许用户选择联系人的对话窗口。我还没有找到一种方法来使用outlook联系人窗口,所以我循环使用ContactFolder.Items并以这种方式完成我的工作。
问题是我必须处理多达70K的联系人。我尝试了多线程和许多其他的东西,但它只是这么慢。加载30k触点需要15秒。
我可以在几毫秒内加载和绑定500k POCO对象,但是当我需要从outlook获取联系人项目时,它只需要永远。问题似乎是当你真正需要从contactitem获取一个属性时,它必须从数据库或其他东西获取它。我可以从中获取联系人缓存吗?我只需要显示和电子邮件,没有别的。身份证会很好,但我不需要它。
有人可以告诉我从outlook获取联系人的更好方法,或者至少告诉我如何打开Outlook联系人选择窗口?我能够找到打开它的代码,但它不会让我,因为我显示了一个模态对话框,如果有一个模态打开它就不会打开。
答案 0 :(得分:3)
答案:
Microsoft.Office.Interop.Outlook.NameSpace ns = Globals.ThisAddIn.Application.GetNamespace("MAPI");
Microsoft.Office.Interop.Outlook.MAPIFolder contactsFld = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts);
Microsoft.Office.Interop.Outlook.Table tb = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderContacts).GetTable(null, Microsoft.Office.Interop.Outlook.OlItemType.olContactItem);
tb.Columns.RemoveAll();
tb.Columns.Add("Email1Address");
tb.Columns.Add("FullName");
object[,] otb = tb.GetArray(100000) as object[,];
int len = otb.GetUpperBound(0);
for (int i = 0; i < len; i++)
{
if (otb[i, 0] == null)
{
continue;
}
Contacts.Add(new ContactItem() { ContactDisplay = otb[i, 1].ToString(), ContactEmail = otb[i, 0].ToString() });
}
这在不到一秒的时间内加载,这足以将其重新放回UI线程。