我收到此错误:
不能使用属于不同线程的 DependencyObject
其父类 Freezable
那有什么意思?是英文的吗?父级是冻结的,还是只是可冻结的?如果可以使错误消失,有什么方法可以使父级不可冻结吗?
发生了什么:
我的 WPF 应用程序中有两个 opengl winforms 控件,到目前为止,一切都运行顺利(我认为)。现在,我添加了一项更新,以便当一个 winform 控件更新图像时,另一个也应该更新。这实际上曾经有效,但现在我遇到了这个错误。单步执行代码会在随机位置发生崩溃,这使我相信这是垃圾收集错误(即,另一个线程中的某些更新正在创建正在被垃圾收集的内容,并且该收集是在随机时间发生的)。
该异常是在 main run 方法中捕获的,它是一个 InvalidOperationException。
我在这里抓住救命稻草。我从哪说起呢?
编辑:看起来导致问题的调用是这个:
if (imagePanel.InvokeRequired)
{
imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{
imagePanel.ClearImages();
}));
}
else
{
imagePanel.ClearImages();
}
我仍在追踪它;如果该系列行被注释掉,崩溃仍然会发生,并且线程状态具有“刚刚结束”线程(因此是垃圾收集假设)。
好吧,我已经弄清楚了。通常,我只是删除这个问题,但找到有关如何解决此问题的任何信息很痛苦。
问题是一个如下所示的调用:
ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...)));
if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) {
button.background = theBrush;
}
else {
labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate {
button.background = theBrush;
}));
}
但!如果你这样做,那么调度程序就会工作,然后它会尝试删除画笔,但画笔本身显然也会在另一个位置被删除。
因此,重要的教训是,如果您声明了 ImageBrush,则在同一线程中删除它,如下所示:
void MyFunc(){
ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...)));
button.background = theBrush;
}
if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) {
MyFunc();
}
else {
labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate {
MyFunc();
}));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)