什么是父母可冻结?这个错误是什么意思?

时间:2009-05-14 18:39:07

标签: wpf invalidoperationexception dependencyobject freezable

我收到了这个错误:

不能使用属于与其父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();
        }

我还在跟踪它;如果该系列行被注释掉,崩溃仍然发生,并且线程状态具有“刚刚结束”的线程(因此是垃圾收集假设)。

1 个答案:

答案 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();
   }));
}