据我所知,托管线程无法保证在同一个OS线程上运行。
如果CLR可以在OS线程之间切换托管线程,这种情况多久发生一次?什么影响频率?
我有一个关于如何阻止切换发生的separate question。对我来说,二等奖不会经常发生(每分钟不到一分钟就好)。
答案 0 :(得分:7)
完全取决于主持人。在给定任何特定主机的情况下,无法保证何时何地可以进行线程切换(如果有的话)。
但是,从.NET 2.0开始,您就可以调用静态BeginThreadAffinity方法来通知主机正在运行的代码取决于底层OS线程的标识:
http://msdn.microsoft.com/en-us/library/system.threading.thread.beginthreadaffinity(VS.80).aspx
当然,确保在线程完成后调用EndThreadAffinity方法(我不确定如果你让线程结束而不调用EndThreadAffinity会发生什么。我无法想象它会产生影响,但它是更好地明确这个问题,IMO):
http://msdn.microsoft.com/en-us/library/system.threading.thread.endthreadaffinity(VS.80).aspx
答案 1 :(得分:4)
据我所知,CLR的当前实现将托管线程映射到OS线程。但是,正如文档所说,这不能保证,即它是一个实现细节,所以你不能假设任何东西。它可能会改变,但即使它没有文档的建议,你也不应该依赖于一对一的映射。
正如casperOne所指出的,你可以设置线程亲和力,但除此之外,没有任何保证。