2011-01-15 8 views
1

私はOutlookアドインで作業しており、ユーザーが連絡先を選択できるダイアログウィンドウがあります。 Outlookの連絡先ウィンドウを使用する方法を見つけることができなかったので、ContactFolder.Itemsをループして、そのように作業しています。VSTO Outlook - 連絡先の反復はとても遅いです!

問題は、最大70,000件の連絡先を処理する必要があることです。私はマルチスレッドや他の多くのことを試みましたが、それはとても遅いです。 30kのコンタクトをロードするのに15秒かかります。

ミリ秒単位で500k POCOオブジェクトをロードしてバインドすることはできますが、Outlookから連絡先アイテムを取得する必要があるときは、それは永遠にかかります。問題は、あなたが実際にデータベースから何かをフェッチする必要があるcontactitemからプロパティを取得する必要があるときのようです。私が引き出すことができる連絡先キャッシュはありますか?私は、DisplayとEmailだけ必要です。 IDはいいですが、私はそれを必要としません。

Outlookから連絡先を取得する方法を教えてもらえますか、Outlookの連絡先選択ウィンドウを開く方法を教えてください。私はそれを開くためのコードを見つけることができましたが、私はモーダルダイアログを表示しているので、モーダルを開いていれば開くことはできません。

答えて

3

回答:バックUIスレッド上に置くのに十分な速度で1秒未満で

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

    } 

このロード。

+0

これを調べるより良い方法は、一度に何千もの連絡先を処理できる方法がないため、アプローチが必要なものを探すことがより良い方法だということです。 –