可能重复:
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会做这项工作......我做错了什么?
答案 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();
}));
}