线程无法访问对象
本文关键字:对象 访问 线程 | 更新日期: 2023-09-27 18:11:37
我有一个UserControl被添加到我的主窗口。Main代码不断地接收TCP消息,并相应地与UserControl交互。其中一个被Main调用的UserControl方法是AddMessage:
internal void AddMessage(Paragraph p)
{
if (txtViewer.Dispatcher.CheckAccess())
{
txtViewer.Document.Blocks.Add(p);
}
else
{
Dispatcher.Invoke(new Action(() =>
{
txtViewer.Document.Blocks.Add(p);
}
));
}
}
Dispatcher中的行。Invoke总是抛出InvalidOperationException。我看过周围类似的问题,其中大多数是Dispatcher没有被使用的情况,所以我不知道为什么我的代码不能工作。我想我使用它不正确,或者它可能与在线程之间传递的段落对象有关。
谢谢,Jared
我有一个类似的问题,无法绑定一个DocumentViewer异步作为FlowDocument派生自Dispatcher。UI不能绑定到从另一个头部的Dispatcher派生的对象。我不得不使用XamlWriter将FlowDocument序列化为字符串(不派生自dispatcher)。保存然后在转换器中反序列化。
您检查txtViewer
的Dispatcher
上的访问,但如果CheckAccess
失败,则调用一些其他 Dispatcher
,您对Dispatcher
一无所知。您希望在txtViewer.Dispatcher
上调用。
这可能与对象被冻结有关。
从Freezable派生的对象的概念是它通常是处于读/写状态,但可以显式地置于只读状态使用Freeze方法。一个冰冻的物体可以被更多的使用在WPF中有效地,因为它不需要通知消费者对象,其值已更改。
WPF中的图形对象,如画笔和3D几何图形来源于冻。初始解冻,对这些对象之一的更改结果将更改通知对象的使用者。
如果你有一个不打算从Freezable派生的对象修改时,可以使用Freeze方法使对象只读。
在冻结对象之后,如果您尝试修改它,你会得到一个InvalidOperationException。但是WPF会更有效地使用对象
From Here:
http://wpf.2000things.com/tag/freezable/