c# - 如何关闭任务内的 WPF 窗口
问题描述
我需要运行一个任务来检查连接。
在这次检查中,我的窗户不应该被冻结。
所以我开始任务,并在任务结束时关闭我的窗口。
但这会返回一个异常:InvalidOperationException:'调用线程无法访问此对象,因为另一个线程拥有它'。
像这样 :
private void Window_ContentRendered(object sender, System.EventArgs e)
{
Task.Run(() =>
{
ConnectionState = false;
if (NetworkTools.CheckGlobalConnection() == (ConnectionStatus.NetworkConnectionSuccess, ConnectionStatus.ServerConnectionSuccess))
{
ConnectionState = true;
}
this.Close();
});
}
如何在任务结束时关闭我的窗口而不冻结它并且没有这个异常?(我有一个无限旋转的进度条)
解决方案
或者你可以只使用async await。Task.Run
将卸载并且等待将在当前 SynchronizationContext 上创建一个延续。反过来将控制权交还给UI并关闭正确的线程。
private async void Window_ContentRendered(object sender, System.EventArgs e)
{
await Task.Run(() =>
{
ConnectionState = false;
if (NetworkTools.CheckGlobalConnection() == (ConnectionStatus.NetworkConnectionSuccess, ConnectionStatus.ServerConnectionSuccess))
ConnectionState = true;
});
this.Close();
}
同样如前所述,Calling ConfigureAwait(false)
在这种情况下, , 不是正确的做法
推荐阅读
- snowflake-cloud-data-platform - SQLAlchemy 和雪花查询 ID
- erlang - Bamboo Mailer & SES 无法向特定用户发送电子邮件
- reactjs - 如何将作为 XML 从服务器传递的 Excel 文件转换为 JavaScript(React)
- python - 由于我需要它们存在的重复值,无法旋转/取消堆叠列
- python - Folium - 基于当前日期的图标颜色 - eval()?
- android - Android 11:如何在可移动存储上以每秒 30 个文件的速度写入(USB 上的 ssd 驱动器)
- r - 在运行长脚本时停止 Rstudio(不仅仅是 1 行)
- r - 您如何将闪亮的选择输入强制为数字以计算平均分数?
- reactjs - UseEffect 无限循环/即使状态没有改变也永远运行
- kubernetes - Airflow KubernetesExecutor 和 minikube:调度程序无法连接到 Minikube