我收到了这个错误:
不能使用属于与其父Freezable不同的线程的DependencyObject
这甚至意味着什么?是英文的吗?父母被冻结了,还是只是可以冻结?任何使父母不可冻结的方法,如果它让错误消失了吗?
发生了什么:
我在WPF应用程序中有两个opengl winforms控件,到目前为止,一切都在顺利进行(我认为)。现在,我添加了一个更新,以便当一个winform控件更新图像时,另一个也应该。这实际上曾经工作,现在我收到了这个错误。逐步执行代码会导致崩溃发生在随机位置,这使我相信它是垃圾收集错误(即,另一个线程中的某些更新正在创建收集垃圾的东西,并且该收集在随机时间发生)。 / p>
异常是在主run方法中捕获的,它是一个InvalidOperationException。
我在这里抓住稻草。我从哪里开始?
编辑:看起来引起问题的电话是这样的:
if (imagePanel.InvokeRequired)
{
imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{
imagePanel.ClearImages();
}));
}
else
{
imagePanel.ClearImages();
}
我还在跟踪它;如果该系列行被注释掉,崩溃仍然发生,并且线程状态具有“刚刚结束”的线程(因此是垃圾收集假设)。
答案 0 :(得分:13)
问题是看起来像这样的电话:
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();
}));
}