首页 > 解决方案 > 如何关闭任务内的 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();
            });
        }

如何在任务结束时关闭我的窗口而不冻结它并且没有这个异常?(我有一个无限旋转的进度条)

标签: c#wpftaskfreeze

解决方案


或者你可以只使用async awaitTask.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)在这种情况下, , 不是正确的做法


推荐阅读