Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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# 无法使用DependencyObject,该对象属于与其父Freezable不同的线程_C#_Wpf_Multithreading_Freezable - Fatal编程技术网

C# 无法使用DependencyObject,该对象属于与其父Freezable不同的线程

C# 无法使用DependencyObject,该对象属于与其父Freezable不同的线程,c#,wpf,multithreading,freezable,C#,Wpf,Multithreading,Freezable,我得到了一个wpf表单,我想在用户从控件中做出选择后立即显示一个加载弹出窗口,因为加载数据可能需要很长时间,因为数据库不是本地的。在我为弹出窗口创建线程之前,我一直在工作 这是我创建线程的地方: public void Start() { if (_parent != null) _parent.IsEnabled = false; _thread = new Thread(RunThread); _t

我得到了一个wpf表单,我想在用户从控件中做出选择后立即显示一个加载弹出窗口,因为加载数据可能需要很长时间,因为数据库不是本地的。在我为弹出窗口创建线程之前,我一直在工作

这是我创建线程的地方:

public void Start()
    {

         if (_parent != null)
             _parent.IsEnabled = false;

         _thread = new Thread(RunThread);

         _thread.IsBackground = true;
         _thread.SetApartmentState(ApartmentState.STA);
         _thread.Start();

         _threadStarted = true;
         SetProgressMaxValue(10);

         Thread th = new Thread(UpdateProgressBar);
         th.IsBackground = true;
         th.SetApartmentState(ApartmentState.STA);
         th.Start();
    }
和线程方法:

private void RunThread()
    {

        _window = new WindowBusyPopup(IsCancellable);
        _window.Closed += new EventHandler(WaitingWindowClosed);
        _window.ShowDialog();
    }
现在执行的那一刻,我得到了这个错误:

无法使用属于其父Freezable之外的其他线程的DependencyObject


任何帮助都将不胜感激:)

请尝试使用表单的Dispatcher属性。 Dispatcher.BeginInvoke(…)


或者只使用该类,因为它有一个名为ReportProgress()的方法来报告进度百分比。当您可以刷新progressbar或其他内容的值时,这将触发ProgressChanged事件…

尝试使用表单的Dispatcher属性。 Dispatcher.BeginInvoke(…)


或者只使用该类,因为它有一个名为ReportProgress()的方法来报告进度百分比。当您可以刷新progressbar或其他内容的值时,这将触发ProgressChanged事件。

不能使用属于与其父Freezable不同线程的DependencyObject。

观察到此错误是因为您正在尝试使用在STA线程(用于显示弹出窗口)的不同线程中创建的资源(UIElement类型)

在您的例子中,它看起来像第二个线程th=新线程(UpdateProgressBar),正在尝试操作WindowBusyPopup中的UI。由于弹出窗口属于另一个线程,因此您将获得此异常

可能的解决方案:(正如我看到的,您没有显示函数UpdateProgressBar的实现)


无法使用DependencyObject,该对象属于与其父Freezable不同的线程。

观察到此错误是因为您正在尝试使用在STA线程(用于显示弹出窗口)的不同线程中创建的资源(UIElement类型)

在您的例子中,它看起来像第二个线程th=新线程(UpdateProgressBar),正在尝试操作WindowBusyPopup中的UI。由于弹出窗口属于另一个线程,因此您将获得此异常

可能的解决方案:(正如我看到的,您没有显示函数UpdateProgressBar的实现)


我尝试调用而不是创建线程不起作用,你建议我如何使用调用?我尝试调用而不是创建线程不起作用,你建议我如何使用调用?
private void UpdateProgressBar()
{
if(_window != null) /* assuming  you declared your window in a scope accesible to this function */
_window.Dispatcher.BeginInvoke(new Action( () => {
// write any code to handle children of window here
}));
}