Dela via


Hanterad och ohanterad trådning i Windows

Hanteringen av alla trådar sker via Thread klassen, inklusive trådar som skapats av Common Language Runtime och de som skapats utanför körningen som går in i den hanterade miljön för att exekvera kod. Körningstiden övervakar alla trådar i processen som någonsin har exekverat kod inom hanteringsmiljön. Den spårar inte några andra trådar. Trådar kan ange den hanterade körmiljön via COM-interop (eftersom körmiljön exponerar hanterade objekt som COM-objekt för den icke-hanterade världen), COM DllGetClassObject-funktionen och plattformsanrop.

När en ohanterad tråd går in i körmiljön via till exempel en COM-anropsbar omslutning, kontrollerar systemet trådens lokala arkiv för att hitta ett internt hanterat Thread-objekt. Om en hittas är körningstiden 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ådhantering är Thread.GetHashCode den stabila hanterade identifieraren. 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 utför inte TerminateThreadfinally-satser eller frigör resurser och kan inte stoppas. Thread.Abort kör dock all återställningskod, återtar alla resurser och kan nekas genom att använda 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 Thread och ThreadStart
TerminateThread Thread.Abort
SuspendThread Thread.Suspend
ResumeThread Thread.Resume
Sov Thread.Sleep
WaitForSingleObject på trådhandtaget Thread.Join
AvslutaTråd Ingen motsvarighet
GetCurrentThread Thread.CurrentThread
SetThreadPriority Thread.Priority
Ingen motsvarighet Thread.Name
Ingen motsvarighet Thread.IsBackground
I närheten av 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 i Processer, 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 MTAThreadAttribute eller STAThreadAttribute på startpunktsproceduren.

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 genom COM-lägenhetsproxier och COM+ 1.0-kontextomslag som dikteras av OLE32.

Blockeringsproblem

Om en tråd gör ett ohanterat anrop till operativsystemet som har blockerat tråden i ohanterad kod, kommer runtime inte att ta kontroll över den för Thread.Interrupt eller Thread.Abort. När det gäller Thread.Abortmarkerar körningstiden tråden för Abort och tar kontrollen av den när den återvänder till 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.WaitForPendingFinalizers, och så vidare, är alla känsliga för Thread.Interrupt och Thread.Abort. Om din tråd också befinner sig i en entrådad lägenhet, kommer alla dessa hanterade blockeringsåtgärder att pumpa meddelanden i din lägenhet korrekt medan din tråd ä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örmiljön.

Se även