2010-03-17 18 views
5

在對象的構造函數我需要創建一個WPF的MediaElement對象:獲得正確的WPF調度員在一個線程

m_videoMedia = new MediaElement(); 

但是類也可以從其他線程實例化,所以我需要使用

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

但我怎麼能得到在該構造正確的調度實例:■

回答

8

你最有可能可以只使用Dispatcher.CurrentDispatcher .Invoke ...

但是,如果由於某種原因無法正常工作,您可以讓您的類接收對分派器的引用作爲其構造函數的一部分。只需在施工時從UI線程傳入Dispatcher.CurrentDispatcher即可。

+8

根據msdn,這將返回與當前線程關聯的調度程序,並將創建一個尚未創建的調度程序。這聽起來不像你想在這種情況下做的事情。您需要與UI關聯的調度程序。或者更具體地說,是特定窗口的調度程序。 – 2010-03-17 20:44:21

+0

用於傳遞對當前調度程序的引用。 – Nate 2010-03-18 14:34:59

+0

在類似的情況下,靜態Dispatcher.CurrentDispatcher不適用於我。按照sinelaw的建議,我嘗試了Application.Current.Dispatcher - 這工作。 – 2013-12-29 19:38:19

2

大多數WPF控件派生自DispatcherObject,它具有您需要的Dispatcher屬性。所以基本上你可以使用你想使用的控件的調度器。在這種情況下,例如,MediaElement添加到的窗口。

-1

如果您將對System.Windows.Forms的引用添加到您的項目中,則可以繼續在WPF中使用Application.DoEvents()

5

As explained in this answer

您可以從靜態應用程序實例搶UI接線員: Application.Current.Dispatcher

您可能要檢查Application.Current爲空第一,因爲它可以 一個關斷期間被清除。

另外,here are the docs爲Application類。