尝试打开Outlook电子邮件时出现WPF任务/线程问题

时间:2018-11-16 22:20:44

标签: c# wpf multithreading outlook

我有一个WPF应用程序,该应用程序的一部分是用户基本上填写类似于Outlook的表单,然后用适当的信息填充Outlook Email。问题在于,当此电子邮件打开时,代码执行将停止,直到发送或关闭电子邮件为止。

我试图将其放在新的线程上,但是要使它起作用,我在各个地方都遇到了各种各样的问题。电子邮件表单的“正文”是一个富文本框,需要先进行格式化,然后才能将其放入Outlook电子邮件中,以使其正确显示。

根据我的了解,剪贴板调用必须放在自己的STA线程上,但是在完成之前返回null。

如何使它正常工作?基本上,我只希望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 :(得分:2)

请勿调用Display(true)-将以模态显示消息。呼叫Display(false)。