簡體   English   中英

線程無法訪問對象

[英]Thread Cannot Access Object

我有一個UserControl添加到我的主窗口。 主代碼不斷接收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。 我查看了類似的問題,其中大部分是調度程序未被使用的情況,所以我不知道為什么我的代碼不起作用。 我想我錯誤地使用它,或者它可能與在線程之間傳遞的Paragraph對象有關。

謝謝,賈里德

您檢查txtViewerDispatcher上的訪問權限,但如果CheckAccess失敗,則在其他 Dispatcher上調用,您對所述Dispatcher一無所知。 您想要在txtViewer.Dispatcher上調用。

我有一個類似的問題,無法綁定DocumentViewer asynch作為派生自Dispatcher的FlowDocument。 UI無法綁定到另一個thead上從Dispatcher派生的對象。 我不得不使用XamlWriter.Save將FlowDocument序列化為字符串(不是從調度程序派生),然后在轉換器中反序列化。

它可能與被凍結的對象有關。

從Freezable派生的對象的想法是它通常處於讀/寫狀態,但可以使用Freeze方法顯式地置於只讀狀態。 可以在WPF中更有效地使用凍結對象,因為它不需要通知消費者其對象的值已更改。

WPF中的圖形對象(如畫筆和3D幾何)派生自Freezable。 最初解凍后,對這些對象之一的更改會導致對象的使用者收到更改通知。

如果您有一個從Freezable派生的對象,您不打算更改,則可以使用Freeze方法將該對象設置為只讀。

凍結對象后,如果嘗試修改它,則會出現InvalidOperationException。 但是WPF在使用對象方面會更有效率。

從這里采取:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM