C# Dispatcher.Invoke和线程访问出现问题
我试图在C#中处理线程,但遇到了一个wierd异常,我不知道如何解决。我有一个BackgroundWorker运行的方法,其中有一段代码: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
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组件。谢谢,我根据您的建议更改了代码结构,现在一切都正常运行了!:)