WPF Task / Threading проблемы при попытке открыть электронную почту Outlook - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть приложение WPF, в котором пользователи заполняют в основном форму, похожую на внешний вид, а затем заполняют электронную почту Outlook соответствующей информацией. Проблема заключается в том, что пока это электронное письмо открыто, выполнение кода останавливается до тех пор, пока оно не будет отправлено или закрыто.

Я пытаюсь поместить его в новый поток, но у меня возникают разные проблемы в разных местах, чтобы заставить его работать. «Тело» формы электронной почты представляет собой расширенное текстовое поле, и его необходимо отформатировать перед помещением в электронную почту Outlook, чтобы оно правильно отображалось.

Из того, что я прочитал, вызовы буфера обмена должны быть помещены в их собственные потоки STA, но затем он возвращает ноль, прежде чем они завершатся.

Как мне заставить это работать должным образом? По сути, все, что я хочу, это чтобы элемент электронной почты Outlook находился в собственном потоке, чтобы он не блокировал выполнение основного потока при его открытии.

private async Task CreateEmail()
{

    try
   {
       //create an outlook object
       await Task.Run(() =>
     {
        MyOutlook.Application oApp = new MyOutlook.Application();

  //we need to check the to strings of that various items and join them together
        var toStrings = emailForm.ToMain;
        toStrings += String.IsNullOrEmpty(emailForm.ToRM) ? "" : ";" + emailForm.ToRM;
         toStrings += String.IsNullOrEmpty(emailForm.ToSM) ? "" : ";" + emailForm.ToSM;

         MyOutlook.MailItem oMailItem = (MyOutlook.MailItem)oApp.CreateItem(MyOutlook.OlItemType.olMailItem);
          oMailItem.To = toStrings;
          oMailItem.CC = emailForm.CC;
          oMailItem.BCC = emailForm.BCC;
          oMailItem.Subject = emailForm.Subject;
          oMailItem.RTFBody = GetRTBText();
          oMailItem.Display(true);
       });

      }
      catch(Exception ex)
     {
     ErrorWindow errWin = new ErrorWindow("There was an error creating the Outlook Email! Error: " + ex.Message);
     errWin.Show();
   }             
}

private byte[] GetRTBText() 
{

    byte[] RTFArr = null;
    //need to create a new STA Thread for the clipboard
    Thread thread = new Thread(() => Clipboard.Clear());

    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
    this.Dispatcher.Invoke(() =>
    {
        RTBBody.SelectAll();
        RTBBody.Copy();                
    });
        Thread thread2 = new Thread(() => RTFArr = Encoding.UTF8.GetBytes  (Clipboard.GetText(TextDataFormat.Rtf)));
        thread2.SetApartmentState(ApartmentState.STA);
        thread2.Start();
        thread.Join();

    return RTFArr;
}

1 Ответ

0 голосов
/ 17 ноября 2018

Не вызывать Display (true) - это отобразит сообщение модально. Дисплей вызова (false).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...