Thread类中Thread.BeginThreadAffinity()
方法的用法是什么? 这对我来说很有帮助,因为我可以理解你是否提供了示例代码。Thread类中Thread.BeginThreadAffinity()方法的用途是什么?
谢谢。
Thread类中Thread.BeginThreadAffinity()
方法的用法是什么? 这对我来说很有帮助,因为我可以理解你是否提供了示例代码。Thread类中Thread.BeginThreadAffinity()方法的用途是什么?
谢谢。
在.NET 1.x中,线程始终与操作系统线程相匹配。在SQL Server团队的要求下,.NET 2.0的这种关联被破坏了。 CLR主机现在可以控制线程映射本身,IHostTaskManager就是这种工作界面。在blog post中有一个很好的背景。
有时代码确实在意它运行在特定的操作系统线程上。 Windows临界区和突变体就是一个例子。真的,任何类型的非托管代码互操作。 Thread.BeginThreadAffinity()调用IHostTaskManager :: BeginThreadAffinity()让主机知道该任务不应该被允许在另一个操作系统线程上运行,而是保持它当前所在的那个线程,直到调用EndThreadAffinity()。
但是,不要担心这一点。 SQL Server项目很糟糕,他们无法得到可靠的结果。没有迹象表明他们会再试一次。
您是否阅读过documentation的备注部分。它很好地解释了IMO。
公共语言运行库 的一些主机,如Microsoft SQL Server的 2005,提供自己的线程 管理。提供其自身线程管理的主机可以随时将 执行任务从一个物理 操作系统线程移动到另一个 。通过此切换,大多数任务不会受到影响 。但是,某些任务 具有线程关联 - 也就是说,它们 取决于操作系统线程的物理 的标识。这些任务 必须通知主机何时执行 不应该切换的代码。
例如,如果您的应用程序调用 的系统API,以获取具有线程关联的操作 系统锁定, 作为一个Win32 CRITICAL_SECTION这样,你 必须 之前调用BeginThreadAffinity获取锁,并释放后 EndThreadAffinity锁定为 。
@binarycoder,不是那个。胸围试图在光纤上运行sqlclr代码。 – 2010-03-25 03:46:34