Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在目标框架4.5中,WPF Dispatcher.Invoke不允许在单独的线程中更新文本块_C#_Wpf - Fatal编程技术网

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

C# 在目标框架4.5中,WPF Dispatcher.Invoke不允许在单独的线程中更新文本块,c#,wpf,C#,Wpf,以下方法来自mainwindow,它调用子窗口中显示的方法。我使用Dispatcher.Invoke thread更新子窗口中的标签,直到完成设备搜索,这在目标框架3.5中运行良好,而在4.5框架中不起作用 private void OnShowBTWindow(bool isSrchDev) { BTMeasure winBTMeasure = new BTMeasure(); winBTMeasure.Owner = this;

以下方法来自mainwindow,它调用子窗口中显示的方法。我使用Dispatcher.Invoke thread更新子窗口中的标签,直到完成设备搜索,这在目标框架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为真,子窗口将关闭。此代码在目标框架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();
                }
            }
       }

请帮助提供解决此问题的输入。

您应该更具体地说明此问题是什么

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


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

代码不起作用是什么意思?你有什么例外吗?如果你只想显示一些文本和禁用按钮,为什么不使用backgroundworker呢?我的设计是使用一个窗口来实现多个目的。最初会有一个带有按钮搜索的窗口,如果用户单击搜索按钮,窗口将关闭,然后再次打开,并显示不同的文本消息,说明正在搜索设备。搜索完成后,将返回带有DeviceSearch的代码,搜索设备窗口将关闭。现在我的问题是,在TargetFramework3.5中,相同的代码正在工作,并且显示了对设备文本的搜索,没有任何问题。但在4.5框架中,窗口是打开的,文本块没有加载。我也尝试了后台工作程序,但它没有在窗口中显示文本块。但窗口是打开的。@user2114103文本块是什么意思?文本搜索设备。。!!?如果是,您可以使用progressChangedMy-req显示一段时间的窗口,直到我收到响应-如果是DeviceSearch-只是告知用户它正在搜索或类似的内容。一旦我得到上述条件的结果,处于打开状态的窗口将关闭。它在3.5 FW中运行良好。同样的窗口在4.5 FW中也被正确打开,但文本块内容丢失/未加载。