0

我通过使用后台工作人员在后台线程中从我的视图模型调用服务模块调用,一切都很好而且花花公子。

服务模块方法有一个操作参数,当服务返回时调用该参数。现在我需要回到 UI 线程来调用操作(我也尝试在我的 viewmodel 方法中返回 UI 线程,该方法是从服务模块调用的。)

所以对于我尝试过的问题的症结所在

Application.Current.RootVisual.Dispatcher.BeginInvoke(() => code stuff here);

这会产生无效的跨线程访问(我明白我在这里无法访问 rootvisual)

然后我尝试以不同的方式让 Dispatcher 如下所示

Deployment.Current.Dispatcher.BeginInvoke() => code here);

我还尝试了一个静态类,它具有我在应用程序启动方法中设置的 Dispatcher 属性,然后尝试使用它进行调用。

虽然使用部署调度程序和我的静态类的调度程序不会产生无效的跨线程访问,但让我如此困惑的关键是,如果我在这些调度程序调用的代码中设置断点,那么我会得到这个System.Threading.Thread。 CurrentThread.ThreadState 是背景

但是,我可以在我的视图模型中更新我的属性,并且视图确实可以毫无问题地更新,但我想知道这里是否还有问题,这将是未来的一个问题。

4

1 回答 1

2

要访问 UI 调度程序,您可以使用此代码 -

Application.Current.Dispatcher.BeginInvoke() => code here);

对于您的评论 -

我应该补充一下,最令人困惑的部分是我读过的内容,使用调度程序是为了保证您回到 UI 线程!

您误解了在 UI 调度程序上调用委托会将您带到 UI 线程,上面的代码调用只会将委托在 UI 调度程序上排队,并将在 UI 线程上执行。但是,执行点将在您调用此操作的后台线程上。

这些链接可能对您有用 -了解调度程序和调度程序概述

于 2012-07-21T17:29:53.950 回答