Dela via


Hanterad och ohanterad trådning i Windows

Hanteringen av alla trådar sker via Thread klassen, inklusive trådar som skapats av den vanliga språkkörningen och de som skapats utanför körningen som anger den hanterade miljön för att köra kod. Körningen övervakar alla trådar i processen som någonsin har kört kod i den hanterade körningsmiljön. Den spårar inte några andra trådar. Trådar kan ange den hanterade körningsmiljön via COM-interop (eftersom körningen exponerar hanterade objekt som COM-objekt för den ohanterade världen), COM DllGetClassObject-funktionen och plattformsanrop.

När en ohanterad tråd går in i körningen via till exempel en COM-anropsbar omslutning kontrollerar systemet trådlokalarkivet för den tråden för att leta efter ett internt hanterat Thread objekt. Om en hittas är körningen redan medveten om den här tråden. Om den inte hittar något skapar körningen dock ett nytt Thread objekt och installerar det i trådlokalt arkiv för den tråden.

I hanterad trådning Thread.GetHashCode är den stabila hanterade trådidentifieringen. Under trådens livslängd kolliderar den inte med värdet från någon annan tråd, oavsett vilken programdomän du hämtar det här värdet från.

Mappning från Win32-trådning till hanterad trådning

I följande tabell mappas Win32-trådelement till deras ungefärliga körningsmotsvarighet. Observera att den här mappningen inte representerar identiska funktioner. Till exempel kör TerminateThread inte slutsatser eller frigör resurser och kan inte förhindras. Kör dock Thread.Abort all återställningskod, återtar alla resurser och kan nekas med hjälp av ResetAbort. Var noga med att läsa dokumentationen noggrant innan du gör antaganden om funktioner.

I Win32 I den vanliga språkkörningen
CreateThread Kombination av tråd och ThreadStart
TerminateThread Thread.Abort
SuspendThread Thread.Suspend
ResumeThread Thread.Resume
Sömn Thread.Sleep
WaitForSingleObject på trådhandtaget Thread.Join
ExitThread Ingen motsvarighet
GetCurrentThread Thread.CurrentThread
SetThreadPriority Thread.Priority
Ingen motsvarighet Thread.Name
Ingen motsvarighet Thread.IsBackground
Nära CoInitializeEx (OLE32.DLL) Thread.ApartmentState

Hanterade trådar och COM-lägenheter

En hanterad tråd kan markeras för att indikera att den är värd för en entrådad eller flertrådad lägenhet. (Mer information om COM-trådarkitekturen finns iProcesser, trådar och lägenheter.) Metoderna GetApartmentState, SetApartmentStateoch TrySetApartmentState för Thread klassen returnerar och tilldelar lägenhetstillståndet för en tråd. Om tillståndet inte har angetts GetApartmentState returnerar ApartmentState.Unknown.

Egenskapen kan bara anges när tråden är i ThreadState.Unstarted tillståndet. Den kan bara anges en gång för en tråd.

Om lägenhetstillståndet inte har angetts innan tråden startas initieras tråden som en flertrådad lägenhet (MTA). Finalizertråden och alla trådar som styrs av ThreadPool är MTA.

Viktigt!

För programstartkod är det enda sättet att kontrollera lägenhetstillståndet att tillämpa proceduren MTAThreadAttributeSTAThreadAttribute eller på startpunkten.

Hanterade objekt som exponeras för COM beter sig som om de hade aggregerat den fritrådade marshallern. Med andra ord kan de anropas från vilken COM-lägenhet som helst på ett fritrådat sätt. De enda hanterade objekten som inte uppvisar det här fritrådade beteendet är de objekt som härleds från ServicedComponent eller StandardOleMarshalObject.

I den hanterade världen finns det inget stöd för SynchronizationAttribute om du inte använder kontexter och kontextbundna hanterade instanser. Om du använder Enterprise Services måste objektet härledas från ServicedComponent (som i sig härleds från ContextBoundObject).

När hanterad kod anropar COM-objekt följer den alltid COM-regler. Med andra ord anropar den via COM-lägenhetsproxy och COM+ 1.0-kontextomslutningar enligt OLE32.

Blockeringsproblem

Om en tråd gör ett ohanterat anrop till operativsystemet som har blockerat tråden i ohanterad kod tar körningen inte kontroll över den för Thread.Interrupt eller Thread.Abort. När det gäller Thread.Abortmarkerar körningen tråden för Abort och tar kontroll över den när den åter anger hanterad kod. Det är bättre att använda hanterad blockering i stället för ohanterad blockering. WaitHandle.WaitOne,WaitHandle.WaitAny, WaitHandle.WaitAll, Monitor.Enter, Monitor.TryEnter, Thread.Join, GC.WaitForPendingFinalizersoch så vidare är alla dynamiska för Thread.Interrupt och till Thread.Abort. Om tråden också finns i en entrådad lägenhet pumpar alla dessa hanterade blockeringsåtgärder meddelanden i din lägenhet korrekt medan tråden är blockerad.

Trådar och fibrer

.NET-trådningsmodellen stöder inte fibrer. Du bör inte anropa någon ohanterad funktion som implementeras med hjälp av fibrer. Sådana anrop kan leda till en krasch av .NET-körningen.

Se även