2

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

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

4

2 回答 2

0

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

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

在您的情况下,它看起来像第二个线程Thread th = new Thread(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
}));
}
于 2012-06-20T12:04:45.123 回答
0

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

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

于 2012-01-30T10:12:21.477 回答