2011-05-17 48 views
2

我试图在C#中处理线程,但我发生在一个奇怪的异常我不知道如何解决。我已经通过了BackgroundWorker的方法运行,其中有这段代码:Dispatcher.Invoke和线程访问的问题

GridView gridView; 
DataView dataView; 

queryTable.GetViewAndDataView(out gridView, out dataView); 

this.listView.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(
    delegate() { 
     listViewView = gridView;      
     listView.ItemsSource = dataView; 
    } 
)); 

GetViewAndDataView填补了GridView和数据视图,同时委托代码设置当前的ListView。 Invoke的使用应该不会引发异常,但是当我尝试运行它时,我得到了以下结果:调用线程无法访问此对象,因为其他线程拥有它

任何人都知道要处理这种异常,或者至少,如何禁用线程对象拥有?

+0

GridView和DataView究竟是什么?是/有GridView控件? – 2011-05-17 11:59:39

+0

GridView和DataView UI组件,还是您自己的类? – 2011-05-17 11:59:56

+0

是的,GridView是一个UI组件,它似乎 – Archedius 2011-05-17 12:48:11

回答

5

该消息是正确的,你不能在后台线程上创建控件并在UI线程中使用它们。你必须在UI线程上创建和分配它们。我建议首先在后台线程中加载数据,然后在UI中执行其余工作。线程

+0

谢谢,我已经改变了我的代码结构反映你的意见,现在都运行良好! :) – Archedius 2011-05-17 12:48:50

2

在运行并行线程之前,您需要将this.listView.Dispatcher保存到某个局部变量中。在这里你必须使用这个变量的调度器。

但是@Polity is right - 您必须在UI线程上创建控件/元素。在并行线程中,您只能创建非UI对象。