2010-03-24 2 views

답변

6

.NET 1.x에서 스레드는 항상 운영 체제 스레드와 일치했습니다. SQL Server 팀의 요청에 따라 .NET 2.0에 대한 해당 연결이 끊어졌습니다. CLR 호스트는 이제 스레드 매핑 자체를 제어 할 수 있습니다. IHostTaskManager은이를위한 작업 말 인터페이스입니다. 이 좋은 배경은 blog post입니다.

가끔은 코드가 특정 운영 체제 스레드에서 실행되는 것을 신경 써야하는 경우가 있습니다. Windows의 중요한 섹션과 돌연변이가 그 예입니다. 실제로 모든 종류의 관리되지 않는 코드 interop. Thread.BeginThreadAffinity()는 IHostTaskManager :: BeginThreadAffinity()를 호출하여 EndThreadAffinity()가 호출 될 때까지 작업이 다른 운영 체제 스레드에서 실행되지 않아야하며 현재 실행중인 스레드에 고정되어야한다는 것을 호스트에 알립니다.

하지만 이것에 대해 걱정하지 마십시오. SQL Server 프로젝트는 흉상이었고 신뢰할 수 없었습니다. 그들이 다시 시도 할 징조는 없습니다.

+0

SQLCLR은 완벽하지는 않지만 필요를 충족시킵니다. 확장 저장된 procs보다 확실히 좋습니다. 왜 그렇게 나쁘다고 생각하니? –

+1

@binarycoder, 아니요. 바스 트는 광섬유에 sqlclr 코드를 실행하려고했습니다. –

4

documentation의 비고 섹션을 읽었습니까? 그것은 꽤 잘 IMO를 설명합니다.

마이크로 소프트의 SQL 서버 2005과 공용 언어 런타임 의 일부 호스트는, 자신의 스레드 관리 기능을 제공합니다. 자체 스레드 관리를 제공하는 호스트는 실제 작업을 하나의 실제 운영 체제 스레드에서 다른 스레드로 으로 언제든지 이동할 수 있습니다. 대부분의 작업은이 전환에 의해 에 영향을받지 않습니다. 그러나 일부 작업 은 스레드 유사성을 가지고 있습니다. 즉, 은 실제 운영 체제 스레드의 ID에 의존합니다. 이러한 작업은 스위치가되어서는 안되는 코드를 실행할 때 호스트에 알려야합니다.

예를 들어, 응용 프로그램은 같은에서 Win32 CRITICAL_SECTION로 스레드 친화력이있는 운영 시스템 잠금을 획득 할 수 시스템이 API를 호출하는 경우, 당신 잠금을 획득 전에 BeginThreadAffinity를 호출 EndThreadAffinity 해제 후해야한다 자물쇠.

관련 문제