在线程中获取正确的WPF调度程序

7
在对象的构造函数中,我需要创建一个WPF mediaElement对象:
m_videoMedia = new MediaElement();

但是这个类也可以从另一个线程实例化,因此我需要使用。
Dispatcher.Invoke(DispatcherPriority.Normal,
    (Action)(() => { m_videoMedia = new MediaElement(); })); 

但是我该如何在构造函数中获取正确的调度程序实例呢?
4个回答

10

您很可能只需使用Dispatcher.CurrentDispatcher.Invoke...

但是,如果由于某种原因它不起作用,您可以在构造函数中将Dispatcher的引用传递给您的类。只需在构造时从UI线程传入Dispatcher.CurrentDispatcher即可。


8
根据 MSDN 的说明,此方法将返回与当前线程相关联的调度程序,并在尚未创建调度程序时创建一个新的调度程序。在这种情况下,这似乎不是您想要做的事情。您需要获取与 UI 相关联的调度程序,更具体地说是特定窗口的调度程序。 - Lars Truijens
传递对当前调度程序的引用,加1。 - Nate
静态的Dispatcher.CurrentDispatcher在类似情况下不起作用。我尝试了sinelaw建议的Application.Current.Dispatcher-它有效。 - Jørn Wildt

6

检查 Application.Current 是否为空有一定的风险。在工作线程中使用 if 检查时可能是有效的,但在之后使用它时可能会变成 null。我通常会将 Application.Current.Dispatcher.Invoke 放在 try-catch 块中。 - guan boshen

2
大多数WPF控件都派生自DispatcherObject,该对象具有您所需的Dispatcher属性。因此,您将使用要使用的控件的调度程序。例如,在此情况下,添加MediaElement的Window中使用。

-2
如果您将引用添加到您的项目中的System.Windows.Forms,那么您就可以在WPF中继续使用Application.DoEvents()。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接