我知道我不应该依赖托管线程和非托管线程之间存在一对一的映射。从MSDN:
操作系统 ThreadId 与托管线程没有固定关系,因为非托管主机可以控制托管线程和非托管线程之间的关系。具体来说,复杂的主机可以使用 Fiber API 针对同一个操作系统线程调度许多托管线程,或者在不同操作系统线程之间移动托管线程。
但在现实生活中,这样的 CLR 主机是否存在?(如果是这样,它们是什么?)我刚刚回答了一个相关的问题,我想知道我的建议对于那个特定情况有多糟糕。
一种可能是 Microsoft SQL Server(从 2005 版开始)。IIRC 甚至根据他们的要求在 CLR 2.0 中内置了特定的托管支持(有关更多背景信息,另请参阅此博客文章),因此他们在使用纤程(也称为用户模式调度)而不是 SQL Server 中的线程时也可以支持 CLR。
然而,这似乎从来没有真正奏效过(来源):
轻量级池不支持公共语言运行时 (CLR) 执行。禁用以下两个选项之一:“启用 clr”或“轻量级池”。
我认为假设没有(生产就绪)主机不将 CLR 线程映射到主机线程 1:1 是相当安全的。
SO周围有几个问答似乎表明相同。
例如,