C# 托管主UI线程是否位于同一(非托管)操作系统线程上?

C# 托管主UI线程是否位于同一(非托管)操作系统线程上?,c#,.net,wpf,multithreading,pinvoke,C#,.net,Wpf,Multithreading,Pinvoke,我正在为遗留Win32应用程序创建托管WPF UI前端。WPF前端是可执行的;作为启动例程的一部分,我在第二个线程中将遗留应用程序作为DLL启动。旧版应用程序的任何UI操作(包括CreateWindowsEx等)都会在主UI线程上重新调用 作为应用程序关闭过程的一部分,我希望正确清理。除此之外,我想在所有非托管窗口上调用destronWindow,以便它们能够正确地清理自己。因此,在关机期间,我使用EnumWindows尝试查找所有非托管窗口。然后我调用我生成的列表。它们在主UI线程上运行 在了

我正在为遗留Win32应用程序创建托管WPF UI前端。WPF前端是可执行的;作为启动例程的一部分,我在第二个线程中将遗留应用程序作为DLL启动。旧版应用程序的任何UI操作(包括
CreateWindowsEx
等)都会在主UI线程上重新调用

作为应用程序关闭过程的一部分,我希望正确清理。除此之外,我想在所有非托管窗口上调用
destronWindow
,以便它们能够正确地清理自己。因此,在关机期间,我使用
EnumWindows
尝试查找所有非托管窗口。然后我调用我生成的列表。它们在主UI线程上运行

在了解了这些背景知识之后,请继续回答我的实际问题:
在EnumWindows的枚举过程中,我必须检查返回的顶级窗口中是否有一个是我的非托管窗口。我通过调用
GetWindowThreadProcessId
来获取窗口创建者的进程id和线程id。我可以将进程id与
process.GetCurrentProcess().id
进行比较,以检查我的应用程序是否创建了它


为了增加安全性,我还想看看主UI线程是否创建了该窗口。但是,返回的线程id是操作系统的线程id(与托管线程id不同)。如中所述,CLR保留将托管线程重新调度到不同OS线程的权利。我是否可以依靠CLR“足够聪明”,永远不对主UI线程执行此操作(由于UI的线程相关性)?然后我可以调用
GetCurrentThreadId
来获取主UI线程的非托管线程id以进行比较。

在.NET 2.0中为自定义CLR主机引入了将托管线程映射到自定义线程方案的功能。特别是SQL Server。他们希望使用光纤,这是SQL Server的一种本机功能。他们做不成,项目被搁置了。目前我所知道的没有任何CLR主机能够真正利用该功能


在默认CLR主机(WPF应用程序中的主机)中,这永远不会是问题。托管线程始终映射到一个OS线程,并且始终映射到一个OS线程。您可以依赖GetCurrentThreadId()返回的值。我严重怀疑这种情况是否会改变,这将是一个重大的突破性变化。类似于Silverlight的未来主机不太可能做到这一点,但您的代码永远不会接近这一点。

听起来像我所期望的那样。我想在任何地方都没有官方/半官方的声明?