我知道我不应该依赖托管和非托管线程之间存在一对一的映射.从MSDN开始:
操作系统ThreadId与托管线程没有固定的关系,因为非托管主机可以控制托管线程和非托管线程之间的关系.具体而言,复杂的主机可以使用Fiber API来针对同一操作系统线程调度许多托管线程,或者在不同的操作系统线程之间移动托管线程.
但是,在现实生活中,是否存在此类CLR主机? (如果是,它们是什么?)我刚刚回答了一个相关问题,我想知道我对that particular case的建议实际上有多糟糕.
解决方法:
一种可能是Microsoft SQL Server(从2005版开始). IIRC甚至根据他们的请求将特定的托管支持内置到CLR 2.0中(有关更多背景信息,请参见this blog post),以便他们在使用光纤(也称为用户模式调度)而不是SQL Server中的线程时也可以支持CLR.
但是,这似乎从来没有真正起作用过(source):
Common language runtime (CLR) execution is not supported under
lightweight pooling. Disable one of two options: “clr enabled” or
“lightweight pooling.
我认为假设没有(生产就绪)主机,而不将CLR线程映射到主机线程1:1是相当安全的.
关于SO的几个Q& A似乎暗示了相同的含义.
例如,
> Is Thread is kernel object ?
> How do I force the CLR to exhibit OS thread switching?