Wpf 什么是父母可自由支配?这个错误意味着什么?
我得到了这个错误: 无法使用属于不同线程的DependencyObject,而不是 它的父代是可自由化的 这到底是什么意思?它是用英语写的吗?父对象是冻结的,还是可冻结的?如果让错误消失,有没有办法使父项不可自由释放 发生了什么: 我在WPF应用程序中有两个opengl winforms控件,到目前为止,一切都很顺利(我想)。现在,我添加了一个更新,这样当一个winform控件更新映像时,另一个也应该更新。这实际上过去是有效的,现在我得到了这个错误。单步执行代码会使崩溃发生在随机的地方,这让我相信这是垃圾收集错误(即,另一个线程中的某些更新正在创建一些被垃圾收集的东西,而垃圾收集是在随机时间发生的) 该异常在主运行方法中捕获,它是InvalidOperationException 我在抓救命稻草。我从哪里开始 编辑:看起来导致问题的电话是:Wpf 什么是父母可自由支配?这个错误意味着什么?,wpf,invalidoperationexception,dependencyobject,freezable,Wpf,Invalidoperationexception,Dependencyobject,Freezable,我得到了这个错误: 无法使用属于不同线程的DependencyObject,而不是 它的父代是可自由化的 这到底是什么意思?它是用英语写的吗?父对象是冻结的,还是可冻结的?如果让错误消失,有没有办法使父项不可自由释放 发生了什么: 我在WPF应用程序中有两个opengl winforms控件,到目前为止,一切都很顺利(我想)。现在,我添加了一个更新,这样当一个winform控件更新映像时,另一个也应该更新。这实际上过去是有效的,现在我得到了这个错误。单步执行代码会使崩溃发生在随机的地方,这让我相
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;
}));
}
但是!如果您这样做,那么dispatcher会工作,然后它会尝试删除画笔,但画笔本身显然也会在另一个位置被删除
因此,带回家的课程是,如果声明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();
}));
}
为数不多的一种情况是,用图表描述一个句子会很有帮助……标题措辞极为糟糕。没有人可以通过搜索任何相关关键字来找到这个问题,因为标题中没有相关关键字。这不是一个支持论坛,正确地表达你的问题…嘿@Timwi,阅读答案。意识到我之所以把这个问题留在这里,是因为我确实找到了答案,但这非常令人沮丧。如果您想编辑标题,请获得更多的代表,并根据您的想法自己编辑。