2010-03-24 18 views

risposta

6

In .NET 1.x, un thread è sempre stato abbinato a un thread del sistema operativo. Su richiesta del team di SQL Server, tale associazione è stata interrotta per .NET 2.0. Un host CLR può ora assumere il controllo della mappatura del thread stesso, lo IHostTaskManager è l'interfaccia work-horse per quello. C'è un buon backgrounder in questo blog post.

A volte il codice si preoccupa davvero che venga eseguito su un particolare thread del sistema operativo. Le sezioni critiche di Windows e i mutanti sarebbero un esempio. In realtà, qualsiasi tipo di codice non gestito interop. Thread.BeginThreadAffinity() richiama IHostTaskManager :: BeginThreadAffinity() per far sapere all'host che l'attività non deve essere abilitata per l'esecuzione su un altro thread del sistema operativo ma si attacca a quella in cui è attualmente attiva, fino a quando viene chiamato EndThreadAffinity().

Ma non preoccuparti di questo. Il progetto SQL Server è stato un fallimento, non sono riusciti a renderlo affidabile. Non ci sono stati segni che ci riproveranno.

+0

SQLCLR non è perfetto, ma soddisfa una necessità. Sicuramente meglio di stored proc estese. Perché pensi che sia così brutto? –

+1

@binarycoder, no non quello. Il busto stava cercando di eseguire il codice sqlclr sulle fibre. –

4

Hai letto la sezione commenti dello documentation. Lo spiega abbastanza bene IMO.

Alcuni host del linguaggio comune runtime, ad esempio Microsoft SQL Server 2005 forniscono la propria gestione dei thread . Un host che fornisce la propria gestione del thread di può spostare un'attività di esecuzione da un thread fisico del sistema operativo a un altro allo in qualsiasi momento. La maggior parte delle attività non è interessata da da questa commutazione. Tuttavia, alcune attività hanno affinità di thread, ovvero, esse sono dipendenti dall'identità di un thread del sistema operativo fisico . Queste attività devono informare l'host quando eseguono il codice che non deve essere cambiato.

Ad esempio, se l'applicazione chiama un sistema API per acquisire un blocco di sistema operativo che ha affinità di thread, come un Win32 CRITICAL_SECTION, si deve chiamare BeginThreadAffinity prima acquisire la serratura, e EndThreadAffinity dopo aver rilasciato il blocco .

Problemi correlati