C# 无法使用DependencyObject,该对象属于与其父Freezable不同的线程
我得到了一个wpf表单,我想在用户从控件中做出选择后立即显示一个加载弹出窗口,因为加载数据可能需要很长时间,因为数据库不是本地的。在我为弹出窗口创建线程之前,我一直在工作 这是我创建线程的地方: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
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
}));
}