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

在对象的构造函数中,我需要创建一个WPF mediaElement对象:

m_videoMedia = new MediaElement(); 

但是这个类也可以从其他线程实例化,所以我需要使用

 Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => { m_videoMedia = new MediaElement(); })); 

但是如何在该构造函数中获得正确的调度程序实例:s

您最有可能只使用Dispatcher.CurrentDispatcher .Invoke …

但是,如果由于某些原因不起作用,您可以让您的类接收对Dispatcher的引用作为其构造函数的一部分。 只需在构建时从UI线程传入Dispatcher.CurrentDispatcher

正如这个答案所解释的 :

您可以从静态应用程序实例中获取UI Dispatcher: Application.Current.Dispatcher

您可能希望首先检查Application.Current是否为null,因为它可以在关闭序列期间清除。

此外, 这是 Application类的文档 。

大多数WPF控件派生自DispatcherObject ,它具有您需要的Dispatcher属性。 所以基本上你会使用你想要使用的控件中的调度程序。 在这种情况下,例如,添加MediaElement的Window。

如果将System.Windows.Forms引用添加到项目中,则可以继续在WPF中使用Application.DoEvents()