C# Dispatcher.Invoke和线程访问出现问题

C# Dispatcher.Invoke和线程访问出现问题,c#,.net,visual-studio,multithreading,thread-safety,C#,.net,Visual Studio,Multithreading,Thread Safety,我试图在C#中处理线程,但遇到了一个wierd异常,我不知道如何解决。我有一个BackgroundWorker运行的方法,其中有一段代码: GridView gridView; DataView dataView; queryTable.GetViewAndDataView(out gridView, out dataView); this.listView.Dispatcher.Invoke(DispatcherPriority.Normal, new Action( delega

我试图在C#中处理线程,但遇到了一个wierd异常,我不知道如何解决。我有一个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应该不会引发异常,但是当我尝试运行它时,我得到了这样一个结果:调用线程无法访问此对象,因为另一个线程拥有它


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

消息是正确的,您不能在后台线程上创建控件并在UI线程上使用它们。您必须在UI线程上创建和分配它们。我建议首先在后台线程中加载数据,然后在UI线程中完成其余工作。在运行并行线程之前,您需要将
this.listView.Dispatcher
保存到某个局部变量。在thred中,必须从此变量使用dispatcher


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

GridView和DataView究竟是什么?GridView是否是控件?GridView和DataView UI组件是您自己的类?是的,GridView似乎是一个UI组件。谢谢,我根据您的建议更改了代码结构,现在一切都正常运行了!:)