在目标框架4.5中,WPF Dispatcher.Invoke不允许在单独的线程中更新文本块

本文关键字:单独 线程 文本 更新 不允许 Dispatcher 框架 目标 WPF Invoke | 更新日期: 2023-09-27 18:26:36

以下方法来自主窗口,它调用子窗口中的方法Show()。我使用Dispatcher.Invoke线程更新子窗口中的标签,直到设备搜索完成,这在目标框架3.5中运行良好,而在4.5框架中不工作

private void OnShowBTWindow(bool isSrchDev)
        {
            BTMeasure winBTMeasure = new BTMeasure();
            winBTMeasure.Owner = this;
            if (!isSrchDev)
            {
                winBTMeasure.ShowDialog();
            }
            else {
                **winBTMeasure.Show(this);**
                if (AvailableDevices != null)
                {
                    winBTMeasure = null;
                    winBTMeasure = new BTMeasure();
                    winBTMeasure.Owner = this;
                    winBTMeasure.ShowDeviceListWindow(this);
                }
            }
        }

以下方法来自子窗口,它会更新子窗口中的文本块,直到设备搜索完成,窗口才会出现,这可能需要2秒钟才能找到设备。一旦DeviceSearch()为true,子窗口将关闭。此代码在目标框架3.5中工作良好,但在目标框架4.5 中不工作

public void Show(Window owner)
        {
            try
            {
                this.Owner = owner;
                this.Dispatcher.Invoke((Action)(() =>
                {
                    txtHeader.Visibility = System.Windows.Visibility.Hidden;
                    txtbody.Text = "Searching for the device..!!";
                    btnCancel.Visibility = System.Windows.Visibility.Hidden;
                    btnSearchCont.Visibility = System.Windows.Visibility.Hidden;
                    this.Show();
                }));
                if (DeviceSearch())
                {
                    this.Close();
                }
            }
       }

请帮助提供解决此问题的意见。

在目标框架4.5中,WPF Dispatcher.Invoke不允许在单独的线程中更新文本块

您应该更具体地了解"这个问题"是什么。

也就是说,我看到您在Dispatcher.Invoke()调用的匿名方法之外调用"this.Close()"。与其他GUI对象成员一样,它也必须在Dispatcher线程上执行。

就这一点而言,我不完全确定在调度器线程之外设置Owner属性是否安全。一般来说,您确实应该努力避免在对象所属线程之外对线程相关对象进行任何访问。