Threads und ThreadingThreads and Threading

Betriebssysteme verwenden Prozesse, um die verschiedenen ausgeführten Anwendungen voneinander zu trennen.Operating systems use processes to separate the different applications that they are executing. Threads sind die Grundeinheit, der ein Betriebssystem Prozessorzeit zuweist, und mehrere Threads können gleichzeitig Code innerhalb dieses Prozesses ausführen.Threads are the basic unit to which an operating system allocates processor time, and more than one thread can be executing code inside that process. Jeder Thread unterhält Ausnahmehandler, eine Planungspriorität und eine Reihe von Strukturen, mit denen das System den Threadkontext speichert, bis er eingeplant ist.Each thread maintains exception handlers, a scheduling priority, and a set of structures the system uses to save the thread context until it is scheduled. Der Threadkontext enthält alle Informationen, die der Thread benötigt, um die Ausführung nahtlos fortzusetzen. Dies schließt auch seine CPU-Register und seinen Stapel im Adressraum des Hostprozesses vom Thread ein.The thread context includes all the information the thread needs to seamlessly resume execution, including the thread's set of CPU registers and stack, in the address space of the thread's host process.

Das .NET Framework unterteilt einen Betriebssystemprozess weiter in einfache, verwaltete Teilprozesse, sogenannte Anwendungsdomänen, die durch System.AppDomain repräsentiert werden.The .NET Framework further subdivides an operating system process into lightweight managed subprocesses, called application domains, represented by System.AppDomain. Dabei können beliebig viele verwaltete Threads (repräsentiert durch System.Threading.Thread) in einer beliebigen Anzahl von Anwendungsdomänen innerhalb desselben verwalteten Prozesses ausgeführt werden.One or more managed threads (represented by System.Threading.Thread) can run in one or any number of application domains within the same managed process. Obwohl in jeder Anwendungsdomäne mit nur einem einzigen Thread begonnen wird, können mithilfe von Code in dieser Anwendungsdomäne zusätzliche Anwendungsdomänen und zusätzliche Threads erstellt werden.Although each application domain is started with a single thread, code in that application domain can create additional application domains and additional threads. Infolgedessen kann sich ein verwalteter Thread frei zwischen Anwendungsdomänen innerhalb desselben verwalteten Prozesses bewegen. Möglicherweise ist auch nur ein Thread vorhanden, der sich zwischen mehreren Anwendungsdomänen bewegt.The result is that a managed thread can move freely between application domains inside the same managed process; you might have only one thread moving among several application domains.

Ein Betriebssystem, das präemptives Multitasking unterstützt, erzielt den Effekt der gleichzeitigen Ausführung mehrerer Threads aus mehreren Prozessen.An operating system that supports preemptive multitasking creates the effect of simultaneous execution of multiple threads from multiple processes. Dazu wird die verfügbare Prozessorzeit auf die Threads aufgeteilt, die diese benötigen, und jedem Thread wird nacheinander ein Prozessorzeitsegment zugewiesen.It does this by dividing the available processor time among the threads that need it, allocating a processor time slice to each thread one after another. Der aktuell ausgeführte Thread wird angehalten, wenn sein Zeitsegment abgelaufen ist, und ein anderer Thread wird wieder gestartet.The currently executing thread is suspended when its time slice elapses, and another thread resumes running. Wenn das System von einem Thread zu einem anderen wechselt, speichert es den Threadkontext des vorzeitig angehaltenen Threads und lädt den gespeicherten Threadkontext des nächsten Threads in die Threadwarteschlange.When the system switches from one thread to another, it saves the thread context of the preempted thread and reloads the saved thread context of the next thread in the thread queue.

Die Länge des Zeitsegments hängt vom Betriebssystem und vom Prozessor ab.The length of the time slice depends on the operating system and the processor. Da jedes Zeitsegment relativ klein ist, scheinen mehrere Threads gleichzeitig ausgeführt zu werden, selbst wenn es nur einen Prozessor gibt.Because each time slice is small, multiple threads appear to be executing at the same time, even if there is only one processor. Dies ist tatsächlich bei Multiprozessorsystemen der Fall, bei denen die ausführbaren Threads auf die verfügbaren Prozessoren verteilt sind.This is actually the case on multiprocessor systems, where the executable threads are distributed among the available processors.

Verwendung mehrerer ThreadsWhen To Use Multiple Threads

Bei Software, mit der Benutzer interagieren, muss diese für ein optimales Benutzererlebnis schnellstmöglich auf die Aktivitäten des Benutzers reagieren.Software that requires user interaction must react to the user's activities as rapidly as possible to provide a rich user experience. Gleichzeitig muss die Software aber auch die notwendigen Berechnungen durchführen, um dem Benutzer die Daten so schnell wie möglich zur Verfügung zu stellen.At the same time, however, it must do the calculations necessary to present data to the user as fast as possible. Wenn Ihre Anwendung nur einen einzigen Ausführungsthread verwendet, können Sie asynchrone Programmierung mit .NET Framework-Remoting oder XML-Webdiensten kombinieren, die mit ASP.NET erstellt wurden. So können Sie die Verarbeitungszeit anderer Computer zusätzlich zu der Ihres eigenen Computers nutzen, um die Reaktionsfähigkeit gegenüber dem Benutzer zu erhöhen und die Datenverarbeitungszeit Ihrer Anwendung zu verringern.If your application uses only one thread of execution, you can combine asynchronous programming with.NET Framework remoting or XML Web services created using ASP.NET to use the processing time of other computers in addition to that of your own to increase responsiveness to the user and decrease the data processing time of your application. Wenn Sie intensive Eingabe-/Ausgabeprozesse ausführen, können Sie auch E/A-Abschlussports verwenden, um die Reaktionsfähigkeit Ihrer Anwendung zu erhöhen.If you are doing intensive input/output work, you can also use I/O completion ports to increase your application's responsiveness.

Vorteile von mehreren ThreadsAdvantages of Multiple Threads

Die Verwendung von mehr als einem Thread ist die leistungsfähigste verfügbare Technik, um die Reaktionsfähigkeit gegenüber dem Benutzer zu erhöhen und fast gleichzeitig die erforderliche Datenverarbeitung zu erledigen.Using more than one thread, however, is the most powerful technique available to increase responsiveness to the user and process the data necessary to get the job done at almost the same time. Auf einem Computer mit einem Prozessor können mehrere Threads diesen Effekt erzielen, indem sie die kurzen Zeiträume zwischen den Benutzerereignissen nutzen, um die Daten im Hintergrund zu verarbeiten.On a computer with one processor, multiple threads can create this effect, taking advantage of the small periods of time in between user events to process the data in the background. Beispielsweise kann ein Benutzer eine Tabellenkalkulation bearbeiten, während ein anderer Thread andere Teile der Tabellenkalkulation innerhalb derselben Anwendung neu berechnet.For example, a user can edit a spreadsheet while another thread is recalculating other parts of the spreadsheet within the same application.

Ohne Modifikation würde die gleiche Anwendung die Benutzerzufriedenheit drastisch erhöhen, wenn sie auf einem Computer mit mehr als einem Prozessor ausgeführt wird.Without modification, the same application would dramatically increase user satisfaction when run on a computer with more than one processor. Ihre einzelne Anwendungsdomäne könnte mehrere Threads verwenden, um die folgenden Tasks abzuschließen:Your single application domain could use multiple threads to accomplish the following tasks:

  • Kommunizieren über ein Netzwerk mit einem Webserver und einer DatenbankCommunicate over a network, to a Web server, and to a database.

  • Ausführen von zeitaufwendigen VorgängenPerform operations that take a large amount of time.

  • Unterscheiden von Tasks unterschiedlicher Priorität.Distinguish tasks of varying priority. Beispielsweise verwaltet ein Thread mit hoher Priorität zeitkritische Tasks, und ein Thread mit niedriger Priorität führt andere Tasks aus.For example, a high-priority thread manages time-critical tasks, and a low-priority thread performs other tasks.

  • Gewährleisten einer reaktionsschnellen Benutzeroberfläche bei gleichzeitigem Zuweisen von Zeitsegmenten für im Hintergrund ausgeführten TasksAllow the user interface to remain responsive, while allocating time to background tasks.

Nachteile von mehreren ThreadsDisadvantages of Multiple Threads

Es wird empfohlen, möglichst wenige Threads zu verwenden, da dadurch die Nutzung der Betriebssystemressourcen minimiert und die Leistung verbessert wird.It is recommended that you use as few threads as possible, thereby minimizing the use of operating-system resources and improving performance. Zudem müssen Sie bei der Entwicklung Ihrer Anwendung für das Threading entsprechende Ressourcenanforderungen und potenzielle Konflikte berücksichtigen.Threading also has resource requirements and potential conflicts to be considered when designing your application. Die Ressourcenanforderungen sehen wie folgt aus:The resource requirements are as follows:

  • Das System belegt Arbeitsspeicher für die Kontextinformationen, die von Prozessen, AppDomain-Objekten und Threads benötigt werden.The system consumes memory for the context information required by processes, AppDomain objects, and threads. Daher ist die Anzahl der Prozesse, AppDomain-Objekte und Threads, die erstellt werden können, durch den verfügbaren Arbeitsspeicher begrenzt.Therefore, the number of processes, AppDomain objects, and threads that can be created is limited by available memory.

  • Die Verfolgung einer großen Anzahl von Threads verbraucht erhebliche Prozessorzeit.Keeping track of a large number of threads consumes significant processor time. Wenn es zu viele Threads gibt, werden die meisten von ihnen keine nennenswerten Fortschritte machen.If there are too many threads, most of them will not make significant progress. Befinden sich die meisten der aktuellen Threads in nur einem Prozess, werden Threads in anderen Prozessen seltener eingeplant.If most of the current threads are in one process, threads in other processes are scheduled less frequently.

  • Die Steuerung der Codeausführung mit vielen Threads ist komplex und kann eine Quelle für viele Fehler sein.Controlling code execution with many threads is complex, and can be a source of many bugs.

  • Wenn Sie Threads zerstören, müssen Sie wissen, welche Probleme auftreten können und wie Sie diese beheben.Destroying threads requires knowing what could happen and handling those issues.

Die Bereitstellung eines gemeinsamen Zugriffs auf Ressourcen kann zu Konflikten führen.Providing shared access to resources can create conflicts. Um Konflikte zu vermeiden, müssen Sie den Zugriff auf gemeinsam genutzte Ressourcen synchronisieren oder steuern.To avoid conflicts, you must synchronize, or control the access to, shared resources. Wenn der Zugriff nicht korrekt synchronisiert wird (in den gleichen oder verschiedenen Anwendungsdomänen), kann es zu Problemen wie Deadlocks (in denen zwei Threads nicht mehr reagieren, während jeder auf den Abschluss des anderen wartet) und Racebedingungen kommen (wenn ein anomales Ergebnis aufgrund einer unerwarteten kritischen Abhängigkeit bei der zeitlichen Steuerung zweier Ereignisse auftritt).Failure to synchronize access properly (in the same or different application domains) can lead to problems such as deadlocks (in which two threads stop responding while each waits for the other to complete) and race conditions (when an anomalous result occurs due to an unexpected critical dependence on the timing of two events). Das System stellt Synchronisierungsobjekte zur Verfügung, mit denen die gemeinsame Nutzung von Ressourcen zwischen mehreren Threads koordiniert werden können.The system provides synchronization objects that can be used to coordinate resource sharing among multiple threads. Zudem wird die Synchronisierung von Ressourcen durch eine geringere Anzahl von Threads vereinfacht.Reducing the number of threads makes it easier to synchronize resources.

Für folgende Ressourcen ist eine Synchronisierung erforderlich:Resources that require synchronization include:

  • Systemressourcen (z.B. Kommunikationsanschlüsse)System resources (such as communications ports).

  • Von mehreren Prozessen (z.B. Dateihandles) verwendete RessourcenResources shared by multiple processes (such as file handles).

  • Ressourcen einer einzelnen Anwendungsdomäne (z.B. globale, statische und Instanzfelder) mit Zugriff durch mehrere ThreadsThe resources of a single application domain (such as global, static, and instance fields) accessed by multiple threads.

Threading und AnwendungsentwurfThreading and Application Design

Im Allgemeinen ist die Verwendung der ThreadPool-Klasse der einfachste Weg, um mehrere Threads für relativ kurze Tasks zu steuern, die andere Threads nicht blockieren, sofern Sie keine besondere Planung der Tasks erwarten.In general, using the ThreadPool class is the easiest way to handle multiple threads for relatively short tasks that will not block other threads and when you do not expect any particular scheduling of the tasks. Es gibt jedoch eine Reihe von Gründen, eigene Threads zu erstellen:However, there are a number of reasons to create your own threads:

  • Wenn Sie eine Task mit einer bestimmten Priorität benötigen.If you need a task to have a particular priority.

  • Wenn Sie eine Task verwenden, die wahrscheinlich längere Zeit ausgeführt wird (und deshalb andere Tasks blockiert).If you have a task that might run a long time (and therefore block other tasks).

  • Wenn Sie Threads in einem Singlethread-Apartment platzieren müssen (alle ThreadPool-Threads befinden sich im Multithread-Apartment).If you need to place threads into a single-threaded apartment (all ThreadPool threads are in the multithreaded apartment).

  • Wenn Sie eine stabile Identität benötigen, die mit dem Thread verbunden ist.If you need a stable identity associated with the thread. Zum Beispiel sollten Sie einen dedizierten Thread verwenden, um ihn abbrechen, anhalten oder anhand des Namens suchen zu können.For example, you should use a dedicated thread to abort that thread, suspend it, or discover it by name.

  • Wenn Sie Hintergrundthreads ausführen müssen, die mit der Benutzeroberfläche interagieren. Hierfür bietet die .NET Framework Version 2.0 eine BackgroundWorker-Komponente, die Ereignisse verwendet, um über threadübergreifendes Marshalling mit dem Benutzeroberflächenthread zu kommunizieren.If you need to run background threads that interact with the user interface, the .NET Framework version 2.0 provides a BackgroundWorker component that communicates using events, with cross-thread marshaling to the user-interface thread.

Threading und AusnahmenThreading and Exceptions

Behandeln Sie Ausnahmen in Threads.Do handle exceptions in threads. Unbehandelte Ausnahmen in Threads, selbst Hintergrundthreads, beenden in der Regel den Prozess.Unhandled exceptions in threads, even background threads, generally terminate the process. Für diese Regel gelten jedoch die folgenden drei Ausnahmen:There are three exceptions to this rule:

  • In einem Thread wird eine ThreadAbortException ausgelöst, da Abort aufgerufen wurde.A ThreadAbortException is thrown in a thread because Abort was called.

  • In einem Thread wird eine AppDomainUnloadedException ausgelöst, da die Anwendungsdomäne entladen wird.An AppDomainUnloadedException is thrown in a thread because the application domain is being unloaded.

  • Der Prozess wurde durch die Common Language Runtime oder einen Hostprozess beendet.The common language runtime or a host process terminates the thread.

Weitere Informationen finden Sie unter Ausnahmen in verwalteten Threads.For more information, see Exceptions in Managed Threads.

Hinweis

In den .NET Framework-Versionen 1.0 und 1.1 erfasst die Common Language Runtime automatisch einige Ausnahmen. z.B. in Threadpoolthreads.In the .NET Framework versions 1.0 and 1.1, the common language runtime silently traps some exceptions, for example in thread pool threads. Dies kann den Anwendungszustand beschädigen und dazu führen, dass die Anwendung nicht mehr reagiert. Das Debuggen kann erhebliche Schwierigkeiten bereiten.This may corrupt application state and eventually cause applications to hang, which might be very difficult to debug.

Siehe auchSee Also

ThreadPool
BackgroundWorker
Datensynchronisierung für MultithreadingSynchronizing Data for Multithreading
Der verwaltete ThreadpoolThe Managed Thread Pool