线程无法访问对象

本文关键字:对象 访问 线程 | 更新日期: 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)。保存然后在转换器中反序列化。

您检查txtViewerDispatcher上的访问,但如果CheckAccess失败,则调用一些其他 Dispatcher,您对Dispatcher一无所知。您希望在txtViewer.Dispatcher上调用。

这可能与对象被冻结有关。

从Freezable派生的对象的概念是它通常是处于读/写状态,但可以显式地置于只读状态使用Freeze方法。一个冰冻的物体可以被更多的使用在WPF中有效地,因为它不需要通知消费者对象,其值已更改。

WPF中的图形对象,如画笔和3D几何图形来源于冻。初始解冻,对这些对象之一的更改结果将更改通知对象的使用者。

如果你有一个不打算从Freezable派生的对象修改时,可以使用Freeze方法使对象只读。

在冻结对象之后,如果您尝试修改它,你会得到一个InvalidOperationException。但是WPF会更有效地使用对象

From Here:

http://wpf.2000things.com/tag/freezable/