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

mmr*_*mmr 11 wpf invalidoperationexception dependencyobject freezable

我收到这个错误:

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

那有什么意思?是英文的吗?父母被冻结了,还是只是可以冻结?任何使父母不可冻结的方法,如果它让错误消失了?

发生了什么:

我在WPF应用程序中有两个opengl winforms控件,到目前为止,一切都在顺利进行(我认为).现在,我添加了一个更新,以便当一个winform控件更新图像时,另一个也应该.这实际上曾经工作过,现在我收到了这个错误.逐步执行代码会导致崩溃发生在随机位置,这使我相信它是一个垃圾收集错误(即,另一个线程中的某些更新正在创建收集垃圾的东西,并且该收集在随机时间发生).

异常是在主run方法中捕获的,它是一个InvalidOperationException.

我在这里抓住稻草.我从哪里开始?

编辑:看起来引起问题的电话是这样的:

        if (imagePanel.InvokeRequired)
        {
            imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{
                imagePanel.ClearImages();
            }));
        }
        else
        {
            imagePanel.ClearImages();
        }
Run Code Online (Sandbox Code Playgroud)

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

mmr*_*mmr 14

好的,我已经弄清楚了.通常,我只是删除这个问题,但找到有关如何解决这个问题的任何信息都很痛苦.

问题是看起来像这样的电话:

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;
   }));
}
Run Code Online (Sandbox Code Playgroud)

但!如果你这样做,那么调度程序工作,然后它尝试删除画笔,但刷子本身也显然在另一个位置被删除.

因此,如果您声明一个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();
   }));
}
Run Code Online (Sandbox Code Playgroud)