2016-03-07 2 views
2

У меня есть кнопка ленты, которая вставляет текст в Outlook Inspector, изменяя объект MailItem на основе получателей в нем. Метод, который вызывается по нажатию выглядит следующим образом:MailItem.HtmlBody выбрасывает исключение не реализовано

public async void OnTemplateClick(Office.IRibbonControl control) 
     { 
      var templateId = control.Tag; 
      var template = templates.GetTemplateById(templateId); 
      await templateUi.SetTemplate(control.Context, template); 
     } 

метод SetTemplate выглядит следующим образом:

public async Task SetTemplate(object window, Template template, 
      SynchronizationContext uiThread = null) 
{ 
Outlook.MailItem currentMailItem = null; 
      Outlook.Recipients olRecps = null; 
      Outlook.Recipient recp = null; 
      Outlook.AddressEntry addEntry = null; 
      try 
      { 
       currentMailItem = GetMailItem(window); 
       olRecps = currentMailItem.Recipients; 
       var recipType = Outlook.OlMailRecipientType.olTo; 
       var recps = from r in olRecps.Cast<Outlook.Recipient>() 
          where r.Type == (int)recipType 
          select r; 
       var numRecps = recps.Count(); 

       var oldBodyHtml = currentMailItem.HTMLBody; 
       ... 

Теперь, иногда, что последняя строка, которая извлекает HTMLBody выдает следующее сообщение об ошибке:

System.Runtime.InteropServices.COMException (0x8E604001): Not implemented. 
    at Microsoft.Office.Interop.Outlook._MailItem.get_HTMLBody() 

Эта ошибка не происходит постоянно и ее очень сложно воспроизвести, поэтому мы в основном видим ее в журналах приложений. Мне было интересно, что может вызвать эту ошибку? Я предположил, что это имеет какое-то отношение к времени этого асинхронного вызова, что означает, что сообщение MailItem не полностью сформировано?

Спасибо!

ответ

4

Модель объекта Outlook не может использоваться для вторичной резьбы. Outlook 2016 немедленно вызовет ошибку при обнаружении такого вызова. В старых версиях Outlook вызовы могут непредсказуемо выходить из строя.

Если вторичный поток является обязательным, только ваши варианты Extended MAPI (C++ или Delphi) или Redemption (его RDO семейство объектов can be used on secondary threads).

+0

Есть ли способ запустить это в основной теме? –

+0

Несомненно, не используйте async/wait. –

Смежные вопросы