У меня есть приложение 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;
}