2011-01-15 11 views
1

Ich arbeite an einem Outlook-Add-in und ich habe ein Dialogfenster, mit dem der Benutzer Kontakte auswählen kann. Ich war nicht in der Lage, eine Möglichkeit zu finden, das Outlook-Kontaktfenster zu verwenden, so dass ich die ContactFolder.Items durchlaufen und meine Arbeit auf diese Weise erledige.VSTO Outlook - Kontakt Iteration ist SO LANGSAM!

Das Problem ist, dass ich bis zu 70K Kontakte behandeln muss. Ich habe Multithreading und viele andere Dinge versucht, aber es ist einfach so langsam. Es dauert 15 Sekunden, um 30k Kontakte zu laden.

Ich kann 500k POCO Objekte in Millisekunden laden und binden, aber wenn ich die Kontaktelemente von Outlook bekommen muss, dauert es einfach ewig. Das Problem scheint zu sein, wenn Sie wirklich eine Eigenschaft vom contactitem holen müssen, die es von der Datenbank oder von etwas holen muss. Gibt es einen Kontakt-Cache, aus dem ich wählen kann? Ich brauche nur Display und Email, sonst nichts. Eine ID wäre nett, aber ich brauche sie nicht.

Kann mir bitte jemand eine bessere Möglichkeit geben, Kontakte von Outlook zu erhalten oder mir zumindest zu sagen, wie man das Outlook Kontaktauswahlfenster öffnet? Ich konnte Code finden, um es zu öffnen, aber es lässt mich nicht, weil ich einen modalen Dialog zeige, und es öffnet sich nicht, wenn es einen modalen offenen gibt.

Antwort

3

Antwort:

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

    } 

Diese Lasten in weniger als einer Sekunde, was schnell genug ist es wieder auf dem UI-Thread zu setzen.

+0

ein besserer Weg, um dies zu betrachten ist, dass es keine Möglichkeit gibt, dass eine Person Tausende Kontakte auf einmal behandeln kann, so dass eine Suche nach dem, was Sie wollen, Ansatz ist ein besserer Weg zu gehen. –