WPF线程 - 无法访问属性/字段

时间:2011-10-16 09:56:21

标签: .net wpf multithreading properties

  

可能重复:
  The calling thread cannot access this object because a different thread owns it

我正在我的应用程序中编写一些线程处理:

BackgroundWorkers()
{
    WorkerThread = new Thread(new ThreadStart(Loop));
    WorkerThread.SetApartmentState(ApartmentState.STA);
    WorkerThread.Start();
}

被调用的方法就是这个:

    public static void Loop()
    {
        while (true)
        {
            if (BackgroundWorkersTick != null)
            {
                BackgroundWorkersTick();
            }
            Thread.Sleep(30 * 1000);
        }
    }

在“客户端”我用这种方式:

BackgroundWorkers.BackgroundWorkersTick += new BackgroundWorkers.BackgroundWorkersTickHandler(Refresh);
...
private void Refresh()
{
    ViewDataCollection.GetData<TableViewData>().Tables = GameClient.ListTables();
    tablesListView1.SetItems(ViewDataCollection.GetData<TableViewData>().Tables);
    tablesListView1.Refresh();
}

TableListView里面有一个方法:

    public void Refresh() { ListItemContainer.Dispatcher.Invoke((Action)BindItems); }

    private void BindItems()
    {
        ListItemContainer.Children.Clear();
        foreach (TablesListViewItem item in items)
        {
            ListItemContainer.Children.Add(item);
        }
    }

iItems定义为:

private List<TablesListViewItem> items;

在第

  

ListItemContainer.Children.Add(项目);

我收到带有消息的InvalidOperationException异常:调用线程无法访问此对象,因为另一个线程拥有它。

这整个代码适用于WPF。我试图切换到属性,但没有效果。我以为Dispatcher会做这项工作......我做错了什么?

1 个答案:

答案 0 :(得分:2)

更改以下行

private void Refresh()
{
    ViewDataCollection.GetData<TableViewData>().Tables = GameClient.ListTables();
    tablesListView1.SetItems(ViewDataCollection.GetData<TableViewData>().Tables);
    tablesListView1.Refresh();
}

private void Refresh()
{
    Application.Current.Dispatcher.Invoke(new Action(()=>
    {
      ViewDataCollection.GetData<TableViewData>().Tables = GameClient.ListTables();
      tablesListView1.SetItems(ViewDataCollection.GetData<TableViewData>().Tables);
      tablesListView1.Refresh();
    }));
}