使用Dispatcher从另一个线程访问对象

时间:2019-07-08 19:22:03

标签: c# wpf dispatcher

我有一个线程在异步下载过程中在后台运行。该线程的目的是确定下载是否已停止。我的代码基本上说“如果我们在最近10秒钟内没有下载更多字节,请假设下载失败,然后执行此操作。”

当我尝试更新WPF窗口上的标签说下载已停止时,被告知无法从非静态引用访问它。因此,我添加了MainWindow main = new MainWindow(),然后将其添加到变量中,以免需要WPF元素是静态的。但是我还需要使用Dispatcher,因为另一个线程已经拥有该对象。所以我的代码看起来像这样:

MainWindow main = new MainWindow();
main.Dispatcher.BeginInvoke(new Action(delegate() {
    main.mainTitle.Content = "Unable to connect to the internet";
}));

尽管那没有任何改变,所以我改变了我的方法。我将Dispatcher更改为此:

MainWindow main = new MainWindow();
Application.Current.Dispatcher.BeginInvoke(new Action(delegate() {
    main.mainTitle.Content = "Unable to connect to the internet";
}));

但是,这似乎无济于事,因为在更改WPF项内容的那一行上,我收到错误消息“调用线程无法访问该对象,因为其他线程拥有它。”

如何从另一个线程更改该对象的内容,为什么Dispatcher不起作用?

1 个答案:

答案 0 :(得分:0)

正如我所见,您正在尝试将一些字符串放入MainWindow。 关键是,WPF从两个线程开始。 UI线程 Render线程。 渲染线程开始渲染WPF屏幕,UI线程负责输入,处理事件...

在您的情况下,您需要权限才能从您自己在代码中创建的另一个线程访问UI线程。 我的调度员看起来像这样:

System.Windows.Application.Current.Dispatcher.Invoke(delegate
{
     //your code to access property / variable / methods etc
});

其他方式: 为什么不使用带有绑定的MVVM之类的模式?如果使用绑定,则可以更改bound属性,该值将在UI中自动更新。我不确定 dispatcher 是否可以直接从其他线程访问WPF元素。