Verwaltetes und nicht verwaltetes Threading in WindowsManaged and unmanaged threading in Windows

Die Verwaltung aller Threads erfolgt über die Thread -Klasse, einschließlich Threads, die von der Common Language Runtime erstellt werden, und Threads, die außerhalb der Runtime erstellt werden und in die verwaltete Umgebung eintreten, um Code auszuführen.Management of all threads is done through the Thread class, including threads created by the common language runtime and those created outside the runtime that enter the managed environment to execute code. Die Laufzeit überwacht alle Threads in ihrem Prozess, die jemals Code in der verwalteten Ausführungsumgebung ausgeführt haben.The runtime monitors all the threads in its process that have ever executed code within the managed execution environment. Sie verfolgt keine anderen Threads.It does not track any other threads. Threads können über COM-Interop (da die Runtime verwaltete Objekte als COM-Objekte für die nicht verwaltete Umgebung verfügbar macht), über die COM- DllGetClassObject -Funktion und über einen Plattformaufruf in die verwaltete Ausführungsumgebung eintreten.Threads can enter the managed execution environment through COM interop (because the runtime exposes managed objects as COM objects to the unmanaged world), the COM DllGetClassObject function, and platform invoke.

Wenn ein nicht verwalteter Thread beispielsweise über einen COM Callable Wrapper in die Runtime eintritt, überprüft das System den lokalen Threadspeicher auf ein intern verwaltetes Thread -Objekt.When an unmanaged thread enters the runtime through, for example, a COM callable wrapper, the system checks the thread-local store of that thread to look for an internal managed Thread object. Wird eins gefunden, ist der Laufzeit dieser Thread bereits bewusst.If one is found, the runtime is already aware of this thread. Wird keins gefunden, erstellt die Runtime jedoch ein neues Thread -Objekt und installiert es im lokalen Threadspeicher dieses Threads.If it cannot find one, however, the runtime builds a new Thread object and installs it in the thread-local store of that thread.

Beim verwalteten Threading ist Thread.GetHashCode die stabile ID für den verwalteten Thread.In managed threading, Thread.GetHashCode is the stable managed thread identification. Für die Lebensdauer des Threads wird kein Konflikt mit dem Wert eines anderen Threads entstehen, unabhängig von der Anwendungsdomäne, aus der Sie diesen Wert erhalten.For the lifetime of your thread, it will not collide with the value from any other thread, regardless of the application domain from which you obtain this value.

Zuordnen zwischen Win32-Threading und verwaltetem ThreadingMapping from Win32 threading to managed threading

In der folgenden Tabelle sind Win32-Threadingelemente ihren ungefähren Laufzeitentsprechungen zugeordnet.The following table maps Win32 threading elements to their approximate runtime equivalent. Beachten Sie, dass diese Zuordnung keine identische Funktionalität darstellt.Note that this mapping does not represent identical functionality. TerminateThread führt beispielsweise keine finally -Klauseln aus, setzt keine Ressourcen frei und kann nicht vermieden werden.For example, TerminateThread does not execute finally clauses or free up resources, and cannot be prevented. Thread.Abort jedoch führt Ihren gesamten Rollbackcode aus, gibt alle Ressourcen frei und kann über ResetAbortverweigert werden.However, Thread.Abort executes all your rollback code, reclaims all the resources, and can be denied using ResetAbort. Lesen Sie unbedingt sorgfältig die Dokumentation, bevor Sie Annahmen über die Funktionalität treffen.Be sure to read the documentation closely before making assumptions about functionality.

In Win32In Win32 In der Common Language RuntimeIn the common language runtime
CreateThreadCreateThread Kombination aus Thread und ThreadStartCombination of Thread and ThreadStart
TerminateThreadTerminateThread Thread.Abort
SuspendThreadSuspendThread Thread.Suspend
ResumeThreadResumeThread Thread.Resume
SleepSleep Thread.Sleep
WaitForSingleObject im ThreadhandleWaitForSingleObject on the thread handle Thread.Join
ExitThreadExitThread Keine EntsprechungNo equivalent
GetCurrentThreadGetCurrentThread Thread.CurrentThread
SetThreadPrioritySetThreadPriority Thread.Priority
Keine EntsprechungNo equivalent Thread.Name
Keine EntsprechungNo equivalent Thread.IsBackground
Nahe an CoInitializeEx (OLE32.DLL)Close to CoInitializeEx (OLE32.DLL) Thread.ApartmentState

Verwaltete Threads und COM-ApartmentsManaged threads and COM apartments

Ein verwalteter Thread kann gekennzeichnet werden, um anzugeben, dass er ein Singlethread - oder ein Multithread -Apartment hostet.A managed thread can be marked to indicate that it will host a single-threaded or multithreaded apartment. (Weitere Informationen zur COM-Threadingarchitektur finden Sie unter Prozesse, Threads und Apartments.) Die Methoden GetApartmentState, SetApartmentState und TrySetApartmentState der Thread-Klasse geben den Apartmentzustand eines Threads zurück und weisen ihn zu.(For more information on the COM threading architecture, see Processes, Threads, and Apartments.) The GetApartmentState, SetApartmentState, and TrySetApartmentState methods of the Thread class return and assign the apartment state of a thread. Wurde der Zustand nicht festgelegt, gibt GetApartmentState den Wert ApartmentState.Unknown zurück.If the state has not been set, GetApartmentState returns ApartmentState.Unknown.

Die Eigenschaft kann nur festgelegt werden, wenn sich der Thread im Zustand ThreadState.Unstarted befindet. Die Eigenschaft kann für einen Thread nur einmal festgelegt werden.The property can be set only when the thread is in the ThreadState.Unstarted state; it can be set only once for a thread.

Wenn der Apartmentzustand nicht festgelegt ist, bevor der Thread gestartet wird, wird der Thread als Multithread-Apartment (MTA) initialisiert.If the apartment state is not set before the thread is started, the thread is initialized as a multithreaded apartment (MTA). Der Finalizerthread und alle von ThreadPool gesteuerten Threads sind MTAs.The finalizer thread and all threads controlled by ThreadPool are MTA.

Wichtig

Bei Anwendungsstartcode besteht die einzige Möglichkeit zum Steuern des Apartmentstatus darin, MTAThreadAttribute oder STAThreadAttribute für das Einstiegspunktverfahren anzuwenden.For application startup code, the only way to control apartment state is to apply the MTAThreadAttribute or the STAThreadAttribute to the entry point procedure.

Verwaltete Objekte, die für COM verfügbar gemacht werden, verhalten sich, als hätten sie den Freethread-Marshaler aggregiert.Managed objects that are exposed to COM behave as if they had aggregated the free-threaded marshaler. Anders gesagt können Sie von jedem COM-Apartment auf eine Freethreadweise aufgerufen werden.In other words, they can be called from any COM apartment in a free-threaded manner. Die einzigen verwalteten Objekte, die dieses Freethread-Verhalten nicht zeigen, die Objekte, die von ServicedComponent oder StandardOleMarshalObject abgeleitet werden.The only managed objects that do not exhibit this free-threaded behavior are those objects that derive from ServicedComponent or StandardOleMarshalObject.

In der verwalteten Umgebung wird SynchronizationAttribute nur unterstützt, wenn Sie Kontexte und kontextgebundene verwaltete Instanzen verwenden.In the managed world, there is no support for the SynchronizationAttribute unless you use contexts and context-bound managed instances. Wenn Sie Enterprise Services verwenden, muss Ihr Objekt aus der ServicedComponent-Klasse abgeleitet sein (die wiederum selbst aus ContextBoundObject abgeleitet ist).If you are using Enterprise Services, then your object must derive from ServicedComponent (which is itself derived from ContextBoundObject).

Wenn verwalteter Code COM-Objekte aufruft, befolgt er immer COM-Regeln.When managed code calls out to COM objects, it always follows COM rules. Anders gesagt erfolgt der Aufruf über COM-Apartmentproxies und COM+ 1.0-Kontext-Wrapper, wie von OLE32 vorgegeben.In other words, it calls through COM apartment proxies and COM+ 1.0 context wrappers as dictated by OLE32.

BlockierproblemeBlocking issues

Wenn ein Thread einen nicht verwalteten Aufruf in der Betriebssystem vornimmt, das den Thread in nicht verwaltetem Code blockiert hat, übernimmt die Laufzeit keine Kontrolle darüber für Thread.Interrupt oder Thread.Abort.If a thread makes an unmanaged call into the operating system that has blocked the thread in unmanaged code, the runtime will not take control of it for Thread.Interrupt or Thread.Abort. Im Fall von Thread.Abortkennzeichnet die Laufzeit den Thread für Abort und übernimmt die Kontrolle darüber, wenn der verwaltete Code erneut eingegeben wird.In the case of Thread.Abort, the runtime marks the thread for Abort and takes control of it when it re-enters managed code. Sie sollten vorzugsweise die verwaltete Blockierung statt die nicht verwaltete Blockierung verwenden.It is preferable for you to use managed blocking rather than unmanaged blocking. WaitHandle.WaitOne,WaitHandle.WaitAny, WaitHandle.WaitAll, Monitor.Enter, Monitor.TryEnter, Thread.Join, GC.WaitForPendingFinalizers usw. reagieren alle auf Thread.Interrupt und Thread.Abort.WaitHandle.WaitOne,WaitHandle.WaitAny, WaitHandle.WaitAll, Monitor.Enter, Monitor.TryEnter, Thread.Join, GC.WaitForPendingFinalizers, and so on are all responsive to Thread.Interrupt and to Thread.Abort. Wenn sich Ihr Thread in einem Singlethread-Apartment befindet, werden all diese verwalteten Blockierungsvorgänge außerdem Meldungen in Ihr Apartment verschieben, während Ihr Thread blockiert ist.Also, if your thread is in a single-threaded apartment, all these managed blocking operations will correctly pump messages in your apartment while your thread is blocked.

Threads und FibersThreads and fibers

Das .NET-Threadingmodell unterstützt keine Fibers.The .NET threading model does not support fibers. Sie sollten keine nicht verwaltete Funktion aufrufen, die mithilfe von Fibers implementiert wurde.You should not call into any unmanaged function that is implemented by using fibers. Solche Aufrufe können zu einem Absturz der .NET-Runtime führen.Such calls may result in a crash of the .NET runtime.

Weitere InformationenSee also