VSTO Outlook - Итерация контактов очень медленная! - PullRequest
1 голос
/ 16 января 2011

Я работаю над надстройкой Outlook, и у меня есть диалоговое окно, которое позволяет пользователю выбирать контакты. Мне не удалось найти способ использовать окно контактов Outlook, поэтому я зацикливаюсь на ContactFolder.Items и выполняю свою работу таким образом.

Проблема в том, что мне приходится обрабатывать до 70 тыс. Контактов. Я пробовал многопоточность и многое другое, но это так медленно. Загрузка 30 тыс. Контактов занимает 15 секунд.

Я могу загружать и связывать 500 тыс. Объектов POCO за миллисекунды, но когда мне нужно получить контактные элементы из внешнего вида, это просто займет вечность. Кажется, проблема в том, что когда вам действительно нужно получить свойство из контактного элемента, оно должно извлечь его из базы данных или чего-то еще. Есть ли кэш контактов, из которого я могу извлечь? Мне нужен только дисплей и электронная почта, ничего больше. Удостоверение личности было бы неплохо, но оно мне не нужно.

Может кто-нибудь сказать мне лучший способ получения контактов из Outlook или хотя бы подскажите, как открыть окно выбора контактов Outlook? Мне удалось найти код, чтобы открыть его, но он не позволил мне, потому что я показываю модальное диалоговое окно, и оно не открывается, если есть модальное открытое.

1 Ответ

3 голосов
/ 16 января 2011

Ответ:

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() });

  }

Это загружается менее чем за секунду, что достаточно быстро, чтобы вернуть его в поток пользовательского интерфейса.

...