2010-05-07 40 views
0

我正在爲傳統Win32應用程序創建託管WPF UI前端。 WPF前端是可執行文件;作爲其啓動例程的一部分,我在第二個線程中將遺留應用程序作爲DLL啓動。在主UI線程上調用傳統應用程序的任何UI操作(包括CreateWindowsEx等)。託管的主UI線程是否停留在同一個(非託管的)操作系統線程上?

作爲應用程序關機過程的一部分,我想正確清理。除其他外,我想在所有非託管窗口上撥打DestroyWindow,以便他們能夠正確清理自己。因此,在關機期間,我使用EnumWindows嘗試查找所有非託管窗口。然後我調用DestroyWindow作爲我生成的列表。這些在主UI線程上運行。

在此背景知識後,我的實際問題:
在EnumWindows的枚舉過程中,我必須檢查返回的頂層窗口之一是否是我的非託管窗口之一。我通過調用GetWindowThreadProcessId來獲取窗口創建者的進程ID和線程ID。我可以將進程ID與Process.GetCurrentProcess().Id進行比較,以檢查我的應用是否創建了它。

爲了額外的安全性,我也想看看我的主UI線程是否創建了窗口。但是,返回的線程ID是操作系統的ThreadId(它與託管線程ID不同)。如this question中所述,CLR保留將託管線程重新安排到不同OS線程的權利。我可以依靠CLR來「足夠聰明」,永遠不會爲主UI線程執行此操作(由於UI的線程相關性)?然後我可以調用GetCurrentThreadId來獲取主UI線程的非託管線程ID以進行比較。

回答

2

在.NET 2.0中爲自定義CLR主機引入了將託管線程映射到自定義線程方案的功能。特別是,SQL Server。他們想使用光纖,這是SQL Server的本地特性。他們無法擺脫它,項目被擱置。我現在沒有注意到CLR主機實際上利用了該功能。

在默認的CLR主機中,它將永遠不會成爲問題,這是您在WPF應用程序中獲得的主機。託管線程始終映射到一個操作系統線程,並始終如此。您可以依賴GetCurrentThreadId()返回的值。我認真地懷疑這將會改變,這將是一個重大的突破性改變。對於某種未來的主機來說,這種情況可能不會發生,類似於Silverlight,但是你的代碼永遠不會接近於此。

+0

這聽起來像我的預期。我認爲在這個地方沒有官方/半官方聲明? – 2010-05-07 14:20:53

相關問題