2010-03-24 16 views

Odpowiedz

6

W .NET 1.x wątek zawsze był dopasowany do wątku systemu operacyjnego. Na prośbę zespołu SQL Server powiązanie to zostało złamane dla .NET 2.0. Host CLR może teraz przejąć kontrolę nad samym mapowaniem gwintów, a interfejs IHostTaskManager jest dla niego interfejsem użytkownika. W tym blog post jest dobre tło.

Czasami kod naprawdę nie obchodzi, że działa na określonym wątku systemu operacyjnego. Sekcje i mutanty krytyczne dla systemu Windows będą przykładem. Naprawdę, każdy rodzaj niezarządzanego kodu współgra. Thread.BeginThreadAffinity() wywołuje funkcję IHostTaskManager :: BeginThreadAffinity(), aby powiadomić hosta, że ​​zadanie nie powinno być uruchamiane w innym wątku systemu operacyjnego, ale należy pozostawić to, które jest aktualnie włączone, do czasu wywołania metody EndThreadAffinity().

Ale, nie martw się o nic z tego. Projekt SQL Server był biustem, nie mogli go niezawodne. Nie było żadnych oznak, że spróbują ponownie.

+0

SQLCLR nie jest idealny, ale spełnia potrzeby. Na pewno lepiej niż rozszerzone przechowywane proc. Jak myślisz, dlaczego jest tak źle? –

+1

@binarycoder, nie, nie ten. Popiersie próbowało uruchomić kod sqlclr na włóknach. –

4

Czy przeczytałeś sekcję uwag documentation. Wyjaśnia to całkiem dobrze IMO.

Niektórzy gospodarze wspólnym językiem wykonywania, takie jak Microsoft SQL Server 2005, zapewniają własną nić zarządzanie. Host, który zapewnia własne zarządzanie wątkami , może przenieść zadanie wykonawcze z jednego fizycznego wątku systemu operacyjnego na inny przy w dowolnym momencie. Większość zadań nie ma wpływu na to przełączenie . Jednak niektóre zadania mają powinowactwo do wątku - to jest one zależą od tożsamości fizycznego wątku systemu operacyjnego . Zadania te muszą informować hosta, gdy wykonują kod , który nie powinien być przełączany.

Na przykład, jeśli aplikacja wymaga system API do nabycia pracującego blokady systemu który posiada gwint powinowactwo takie jak Win32 CRITICAL_SECTION, ty musi wywołać BeginThreadAffinity przed pozyskiwania blokadę i EndThreadAffinity po zwolnieniu blokada .

Powiązane problemy