在(异步)等待之后关闭表单

时间:2014-09-06 10:51:47

标签: c# multithreading winforms asynchronous vsto

这是我的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东西正常工作。

1 个答案:

答案 0 :(得分:1)

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

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

delegate void DoUICallback();

并在异步代码中:

DoUICallback Callback = new DoUICallback(CallClose);

最后:

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

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