我有一个调用Web服务的Outlook AddIn。它过去是同步的,但我最近使Web服务调用异步。我注意到在某些情况下,异步调用在启动调用的主STA线程上返回,而在其他情况下则没有。当代码触及UI元素时,它显然不会导致后续异常,例如创建如下所示的SaveEmail表单:
public async void SaveReadEmailToFile(IRibbonControl control)
{
await SaveEmail(ThisAddIn.ActiveInstance.GetSelectedFocusedMailItem());
}
public static async Task SaveEmail(MailItem msgToSave)
{
// If we create the Form here, we stay on the STA thread after the async call.
var saveEmailForm = new SaveEmail();
if (await CanPingServer() == false) return;
// If we create the Form here, we are on a background thread.
// var saveEmailForm = new SaveEmail();
try
{
// ...
}
}
我注意到的是,如果我在进行异步调用之前创建了表单,则始终在STA线程上返回执行。如果我不这样做,则在后台线程上返回执行。
我有两个问题:为什么会发生这种情况,并且我正在做的事情是确定性的并且始终能够可靠地运作?