在(async)等待之后关闭窗体

本文关键字:窗体 之后 等待 async | 更新日期: 2023-09-27 18:20:56

这是我的winform,它是从VSTO插件打开的。它上面有一个按钮,可以启动异步任务(异步web请求),如果响应令人满意,则关闭表单:

public partial class MyForm : Form
{
    private async void Btn_Click(object sender, EventArgs e)
    {
        var response = await doAsyncRequest();
        if (response.Worked())
        {
            Close();
        }
    }
}

在到达Close()调用以关闭表单之前,一切都很好,这是一个例外:System.InvalidOperationException - Additional information: Cross-thread operation not valid: Control 'MyForm' accessed from a thread other than the thread it was created on.

当直接从VSTO功能区启动时,其他async/await内容运行良好。

在(async)等待之后关闭窗体

问题是Close()会破坏视觉元素,而视觉元素只能从创建它们的线程访问。因此,您必须切换到主线程才能关闭您的表单。

虽然我对这件事还很陌生,但到目前为止,我已经成功地处理了这类事情:

delegate void DoUICallback();

并且从异步代码中:

DoUICallback Callback = new DoUICallback(CallClose);

最后:

private void CallClose()
{
  // Whatever UI code you want to do
  Close();
}

我还没有尝试过以这种方式关闭表单,我所有的东西都在显示我能立即显示的内容,并将数据库内容放在后台,以便在加载时显示。