2011-01-15 4 views
1

Outlook 추가 기능에서 작업 중이며 사용자가 연락처를 선택할 수있는 대화 상자 창이 있습니다. 나는 Outlook 연락처 창을 사용하는 방법을 찾을 수 있었기 때문에 ContactFolder.Items를 반복하면서 작업을 그렇게 할 수있었습니다.VSTO Outlook - 연락처 반복이 너무 느립니다!

문제는 최대 70,000 개의 연락처를 처리해야한다는 것입니다. 멀티 스레딩과 다른 많은 것들을 시도했지만 너무 느립니다. 30k 개의 연락처를로드하는 데 15 초가 걸립니다.

밀리 초 단위로 500k POCO 개체를로드하고 바인딩 할 수 있지만 Outlook에서 연락처 항목을 가져와야하는 경우 영원히 걸립니다. 문제는 실제로 데이터베이스에서 물건을 가져올 contactitem에서 속성을 가져와야 할 때인 것처럼 보입니다. 내가 가져올 수있는 연락처 캐시가 있습니까? 나는 Display and Email 만 필요합니다. ID는 좋지만 필요는 없습니다.

누군가가 Outlook에서 연락처를 가져 오는 더 좋은 방법을 말해 줄 수 있습니까? 아니면 적어도 Outlook 연락처 선택 창을 여는 방법을 말해 줄 수 있습니까? 나는 그것을 열 수있는 코드를 찾을 수 있었지만, 모달 대화 상자를 보여주고 있기 때문에 열어 본적이 없습니다. 모달이 열려 있으면 열지 않습니다.

답변

3

답변 : 다시 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() }); 

    } 

이로드됩니다.

+0

이보다 더 좋은 방법은 한 번에 수천 개의 연락처를 처리 할 수있는 방법이 없다는 것입니다. 따라서 접근 방법을 찾는 것이 더 좋은 방법입니다. –

관련 문제