簡體   English   中英

在后台線程中使用System.AddIn的FrameworkElementAdapters

[英]Using System.AddIn's FrameworkElementAdapters in background threads

在無需過多了解“為什么”的情況下,這就是我的情況。 我需要創建一個INativeHandleContract,以將UserControl跨AppDomain邊界傳遞,從新的AppDomain進入主AppDomain,然后將其添加到StackPanel中。 但是我也在嘗試在其他線程中執行此操作。 我遇到了一種情況,即如果所有這些控件都在同一線程中運行,則似乎已正確添加了UserControl。 如果我從一個單獨的線程將UserControl添加到StackPanel,它似乎被添加了,但屏幕上沒有任何顯示。 因此,我將其歸結為以下代碼,並找到了區別。 首先是工作代碼:

private void AddTestControlInNewThread()
{
    System.Threading.Thread t = new System.Threading.Thread(AddTestControl);
    t.SetApartmentState(System.Threading.ApartmentState.STA);
    t.Start();
}

private void AddTestControl()
{
    INativeHandleContract contract;
    FrameworkElement fe;

    Dispatcher.Invoke(new Action(() => 
    {
        contract = FrameworkElementAdapters.ViewToContractAdapter(new Label() { Content = DateTime.Now.ToString() });
        fe = FrameworkElementAdapters.ContractToViewAdapter(contract);
        parentStackPanel.Children.Add(fe);

    }), null);
}

那很好,但是,在我的場景中,我無法在Dispatcher.Invoke調用中創建“合約”。 因此,我將其移至該范圍之外,這就是停止工作的地方。 這是代碼上的區別:

private void AddTestControl()
{
    INativeHandleContract contract;
    FrameworkElement fe;

    contract = FrameworkElementAdapters.ViewToContractAdapter(new Label() { Content = DateTime.Now.ToString() });

    Dispatcher.Invoke(new Action(() => 
    {

        fe = FrameworkElementAdapters.ContractToViewAdapter(contract);
        parentStackPanel.Children.Add(fe);

    }), null);
}

誰能闡明為什么即使沒有成功將用戶控件添加到parentStackPanel的Children集合中,用戶控件也不會出現? 提前致謝。

我很想知道您獨特情況背后的原因。 我假設Dispatcher與在其上創建parentStackPanel的同一線程關聯。 WPF控件具有線程親和性,並且所有它們都必須從同一線程中進行修改。 您正在構造一個Label對象,在第一個示例中,該對象與StackPanel處於同一線程中,這很好。 在第二個示例中,它是在其他線程上構造的,這很可能是代碼無法正常工作的原因。 附加調試器,您應該捕獲一些引發的異常。

暫無
暫無

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

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