gpt4 book ai didi

wpf - 什么是父级可卡住?这个错误是什么意思?

转载 作者:行者123 更新时间:2023-12-04 02:01:00 27 4
gpt4 key购买 nike

我收到此错误:

Cannot use a DependencyObject that belongs to a different thread than its parent 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();
}));
}

关于wpf - 什么是父级可卡住?这个错误是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/865002/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com