Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VSTO Outlook-联系人迭代太慢了!_C#_.net_Wpf_Outlook_Vsto - Fatal编程技术网

C# VSTO Outlook-联系人迭代太慢了!

C# VSTO Outlook-联系人迭代太慢了!,c#,.net,wpf,outlook,vsto,C#,.net,Wpf,Outlook,Vsto,我正在使用outlook加载项,我有一个对话框窗口,允许用户选择联系人。我还没有找到使用outlook联系人窗口的方法,所以我在ContactFolder.Items中循环,并以这种方式完成我的工作 问题是我必须处理多达70K个联系人。我尝试了多线程和其他很多方法,但是速度太慢了。加载30k个触点需要15秒 我可以在几毫秒内加载和绑定500k POCO对象,但当我需要从outlook获取联系人项目时,这只需要永远。问题似乎是当您实际需要从contactitem获取属性时,它必须从数据库或其他地方

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

问题是我必须处理多达70K个联系人。我尝试了多线程和其他很多方法,但是速度太慢了。加载30k个触点需要15秒

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

有人能告诉我从outlook获取联系人的更好方法吗,或者至少告诉我如何打开outlook联系人选择窗口?我能够找到代码来打开它,但它不允许我打开,因为我正在显示一个模式对话框,如果有模式打开,它将不会打开。

回答:

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

回答:

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

更好的方法是,一个人无法同时处理数千个联系人,因此搜索你想要的方法是更好的方法。更好的方法是,一个人无法处理数千个联系人立即联系,因此搜索您想要的方法是更好的方式。