2011-08-24 81 views
1

我已經閱讀了幾篇文章,並通過谷歌的參考,但還沒有拿出適當的解決方案。獲取主應用程序的線程ID

我有一個程序集顯示一個對話框,但該對話框需要從主線程顯示。調用者可以是.NET應用程序或本機應用程序。

從概念上講,似乎我只是需要獲取應用程序的主線程ID,然後致電System.Windows.Threading.Dispatcher.FromThread(main_thread_id_here)以獲取調度程序,然後調用Invoke以顯示主線程中的對話框。但是,我一直無法弄清楚如何獲得主線程ID。

我的下一個方法是(遵循另一個SO問題的建議)遍歷Process.GetCurrentProcess().Threads,並獲得首先啓動的ProcessThread的線程ID。但現在我有這個ProcessThread,我沒有辦法得到相應的Thread對象。我想我可以在當前進程中獲得所有正在運行的.NET線程的列表,並通過GetHashCode比較它們的線程ID,以確定哪一個是主線程。然後我可以使用FromThread來獲得Dispatcher ...但我一直無法找到任何關於檢索除ProcessThreads之外的任何信息!

有沒有人有關於如何解決這個問題的提示,使用上面解釋過的任何一種方法,或者可能是另一種方法?請記住,我無法控制呼叫應用程序。

回答

2
Application.Current.Dispatcher.BeginInvoke(new Action(() => 
{ 
    // Show dialog 
})); 

您還可以從Window.Dispatcher屬性中獲取調度程序。

+0

我以前試過這個,我記得它不起作用,因爲Dispatcher.CurrentDispatcher不一定會給你主線程。它可以很好地給你一個工作線程。 IIRC,如果您從尚未擁有一個線程的線程請求分派器,則會自動創建並返回。 – Dave

+0

已將該帖子更新爲'Application.Current.Dispatcher'。這種方式適用於我;原本我想起了一種不同的方式。如果這仍然無法用於任何原因,你可以從你的'Window's之一取一個Dispatcher對象。 – RandomEngy

+0

好的,真棒,適用於我的.NET測試應用程序。愚蠢的問題 - 即使調用者是本機應用程序,它的工作原理是否相同? – Dave