我有一个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;
}
答案 0 :(得分:2)
请勿调用Display(true)-将以模态显示消息。呼叫Display(false)。