2010-03-24 100 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鎖定爲 。