2010-03-24 101 views

回答

6

在.NET 1.x中,线程始终与操作系统线程相匹配。在SQL Server团队的要求下,.NET 2.0的这种关联被破坏了。 CLR主机现在可以控制线程映射本身,IHostTaskManager就是这种工作界面。在blog post中有一个很好的背景。

有时代码确实在意它运行在特定的操作系统线程上。 Windows临界区和突变体就是一个例子。真的,任何类型的非托管代码互操作。 Thread.BeginThreadAffinity()调用IHostTaskManager :: BeginThreadAffinity()让主机知道该任务不应该被允许在另一个操作系统线程上运行,而是保持它当前所在的那个线程,直到调用EndThreadAffinity()。

但是,不要担心这一点。 SQL Server项目很糟糕,他们无法得到可靠的结果。没有迹象表明他们会再试一次。

+0

SQLCLR并不完美,但它满足了一个需求。当然比扩展存储过程更好。你为什么觉得这么糟糕? – 2010-03-25 03:16:33

+1

@binarycoder,不是那个。胸围试图在光纤上运行sqlclr代码。 – 2010-03-25 03:46:34

4

您是否阅读过documentation的备注部分。它很好地解释了IMO。

公共语言运行库 的一些主机,如Microsoft SQL Server的 2005,提供自己的线程 管理。提供其自身线程管理的主机可以随时将 执行任务从一个物理 操作系统线程移动到另一个 。通过此切换,大多数任务不会受到影响 。但是,某些任务 具有线程关联 - 也就是说,它们 取决于操作系统线程的物理 的标识。这些任务 必须通知主机何时执行 不应该切换的代码。

例如,如果您的应用程序调用 的系统API,以获取具有线程关联的操作 系统锁定, 作为一个Win32 CRITICAL_SECTION这样,你 必须 之前调用BeginThreadAffinity获取锁,并释放后 EndThreadAffinity锁定为 。