[英]Outlook VSTO plugin stops executing while iterating over contacts in default contacts folder
我編寫了一個 Outlook 插件,其中一種方法通過在默認聯系人文件夾中搜索具有指定電子郵件地址的聯系人來搜索聯系人的電話號碼。
下面示例中的 for 循環似乎對我的某些 Outlook 用戶停止運行。 “處理聯系”消息是記錄的最后一條消息,“迭代完成”消息永遠不會出現。
此外,似乎沒有異常發生(我現在無法在開發盒上測試這個,我依賴於我記錄的調試消息),該方法似乎只是在 for 循環和調用該方法的方法中間停止下面不繼續執行。
var phoneNumbers = new List<PhoneNumberModel>();
var mailAddress = "findme@incontacts.com";
var contacts = Application.ActiveExplorer().Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
if(contacts != null)
{
logger.Debug($"Iterating contact items...");
foreach (ContactItem foundContact in contacts.Items)
{
logger.Debug("Processing contact: {contact.CompanyAndFullName}");
if ((foundContact.Email1Address?.ToLower() ?? "").Contains(mailAddress.ToLower()))
{
if (!string.IsNullOrWhiteSpace(foundContact.BusinessTelephoneNumber))
{
phoneNumbers.Add(new PhoneNumberModel { NumberType = "Business phone number", PhoneNumber = foundContact.BusinessTelephoneNumber });
}
}
logger.Debug($"AddPhoneNumbersFromDefaultAddressBook() Iteration completed");
}
}
我懷疑某種 API 超時,因此我將上述方法的調用包裝在超時處理程序中:
int timeout = 1000;
var task = SomeOperationAsync();
if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
// task completed within timeout
} else {
// timeout-logic
}
// further-logic
超時邏輯和進一步邏輯不執行。
任何想法可能會發生什么?
您的代碼假定您只能在 Contacts 文件夾中擁有ContactItem
對象。 如果您有一個DistItem
對象,它將失敗。
另請記住,您無法在輔助線程(例如Task
對象使用的線程)上訪問 Outlook 對象模型。 只能從輔助線程訪問擴展 MAPI 對象,但這需要擴展 MAPI。 如果使用Redemption是一個選項,那么RDO對象系列是否包裝了擴展 MAPI 並且可以從輔助線程訪問。
第三,永遠不要遍歷文件夾中的所有項目,讓Items.Find/FindNext
或Items.Restrict
完成繁重的工作。 在您的特定情況下,該查詢可能類似於 [ Email1Address] = 'user@site.demo'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.