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

时间:2012-01-25 08:25:51

标签: c# wpf multithreading freezable

我有一个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。

任何帮助将不胜感激:)

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

观察到此错误是因为您正在尝试使用在您的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
}));
}