当从同一个线程创建对象时,调用线程无法访问对象

时间:2017-11-23 14:57:08

标签: c# wpf

我正在动态构建我的WPF布局,出于某种原因,当我尝试使用不同的线程向网格添加控件时,我得到了:

  

System.InvalidOperationException:'调用线程无法访问此对象,因为另一个线程拥有它。'

我知道如果他们从不同的线程访问我需要调用我的控件,这就是我正在做的事情。

public void controlInvoke(Grid control, Action action)
{
    control.Dispatcher.Invoke((Delegate)action);
}

当我从线程中向网格添加新的行定义时,它可以正常工作。

controlInvoke(installedApplicationGrid, () =>
{
    installedApplicationGrid.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto });
});  

孩子们是用另一种方法建造的,如下所示。

private StackPanel BuildAppPanel()
{
    StackPanel panel = new StackPanel();

    Grid innerGrid = new Grid();
    innerGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Star) });
    innerGrid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(50, GridUnitType.Star) });
    innerGrid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(100, GridUnitType.Star) });

    panel.Children.Add(innerGrid);

    return panel;
}

生成面板并尝试将其添加到网格的实际代码是。

StackPanel applicationPanel = BuildAppPanel();

controlInvoke(installedApplicationGrid, () =>
{
    installedApplicationGrid.Children.Add(applicationPanel);
});

此时,错误消息显示。我不明白为什么在使用这个线程动态构建所有控件时会发生这种情况。对我来说,为什么添加行定义很好没有意义,但添加新控件却没有。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

所以在仔细观察之后,我通过在动作中移动BuildPanel来修复它。

controlInvoke(installedApplicationGrid, () =>
{
    StackPanel applicationPanel = BuildAppPanel();
    installedApplicationGrid.Children.Add(applicationPanel);
});     

现在一切正常。感谢@Fildor的建议。