VSTO Outlook - 联系迭代很慢!

时间:2011-01-15 22:55:33

标签: c# .net wpf outlook vsto

我正在使用Outlook加载项,我有一个允许用户选择联系人的对话窗口。我还没有找到一种方法来使用outlook联系人窗口,所以我循环使用ContactFolder.Items并以这种方式完成我的工作。

问题是我必须处理多达70K的联系人。我尝试了多线程和许多其他的东西,但它只是这么慢。加载30k触点需要15秒。

我可以在几毫秒内加载和绑定500k POCO对象,但是当我需要从outlook获取联系人项目时,它只需要永远。问题似乎是当你真正需要从contactitem获取一个属性时,它必须从数据库或其他东西获取它。我可以从中获取联系人缓存吗?我只需要显示和电子邮件,没有别的。身份证会很好,但我不需要它。

有人可以告诉我从outlook获取联系人的更好方法,或者至少告诉我如何打开Outlook联系人选择窗口?我能够找到打开它的代码,但它不会让我,因为我显示了一个模态对话框,如果有一个模态打开它就不会打开。

1 个答案:

答案 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线程。