在Outlook Addin中进行异步调用后,继续使用主STA线程

时间:2018-06-15 08:38:00

标签: asynchronous async-await outlook-addin

我有一个调用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线程上返回执行。如果我不这样做,则在后台线程上返回执行。

我有两个问题:为什么会发生这种情况,并且我正在做的事情是确定性的并且始终能够可靠地运作?

0 个答案:

没有答案