在(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内容运行良好。
问题是Close()会破坏视觉元素,而视觉元素只能从创建它们的线程访问。因此,您必须切换到主线程才能关闭您的表单。
虽然我对这件事还很陌生,但到目前为止,我已经成功地处理了这类事情:
delegate void DoUICallback();
并且从异步代码中:
DoUICallback Callback = new DoUICallback(CallClose);
最后:
private void CallClose()
{
// Whatever UI code you want to do
Close();
}
我还没有尝试过以这种方式关闭表单,我所有的东西都在显示我能立即显示的内容,并将数据库内容放在后台,以便在加载时显示。