Dispatcher.Invoke和线程访问的问题

时间:2011-05-17 11:54:10

标签: c# .net visual-studio multithreading thread-safety

我试图在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不应该引发异常,但是当我尝试运行它时,我得到了这个:调用线程无法访问此对象,因为另一个线程拥有它

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

2 个答案:

答案 0 :(得分:5)

消息是正确的,您无法在后台线程上创建控件并在UI线程上使用它们。您必须在UI线程上创建和分配它们。我建议先在后台线程中加载数据,然后在UI线程

中完成剩下的工作

答案 1 :(得分:2)

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

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