【问题标题】:Problems with Dispatcher.Invoke and thread accessDispatcher.Invoke 和线程访问的问题
【发布时间】:2011-05-17 11:54:09
【问题描述】:

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

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

【问题讨论】:

  • GridView 和 DataView 到底是什么?是否/有 GridView 控件?
  • 是 GridView 和 DataView UI 组件,还是你自己的类?
  • 是的,GridView 看起来是一个 UI 组件

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


【解决方案1】:

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

【讨论】:

  • 谢谢,我已经根据您的建议更改了代码结构,现在一切正常! :)
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多