我试图在C#中处理线程,但我发生了一个奇怪的例外,我不知道如何解决。我有一个由BackgroundWorker运行的方法,其中有一段代码:
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和dataView,而委托代码设置当前listView。使用Invoke不应该引发异常,但是当我尝试运行它时,我得到了这个:调用线程无法访问此对象,因为另一个线程拥有它。
任何人都知道要处理这样的异常,或者至少如何禁用线程对象拥有?
答案 0 :(得分:5)
消息是正确的,您无法在后台线程上创建控件并在UI线程上使用它们。您必须在UI线程上创建和分配它们。我建议先在后台线程中加载数据,然后在UI线程
中完成剩下的工作答案 1 :(得分:2)
在运行并行线程之前,需要将this.listView.Dispatcher
保存到某个局部变量。在thred中你必须使用来自这个变量的调度程序。
但是@Polity is right - 您必须在UI线程上创建控件/元素。在并行线程中,您只能创建非UI对象。