Verwenden von Threads und ThreadingUsing threads and threading

Sie können mit .NET Anwendungen schreiben, die mehrere Vorgänge zur gleichen Zeit ausführen.With .NET, you can write applications that perform multiple operations at the same time. Vorgänge, die möglicherweise andere Vorgänge aufhalten, können in separaten Threads ausgeführt werden. Dieser Prozess ist als Multithreading oder Freies Threading bekannt.Operations with the potential of holding up other operations can execute on separate threads, a process known as multithreading or free threading.

Clientanwendungen, die Multithreading verwenden, reagieren besser auf Benutzereingaben, weil die Benutzeroberfläche aktiv bleibt, da prozessorintensive Aufgaben in separaten Threads ausgeführt werden.Applications that use multithreading are more responsive to user input because the user interface stays active as processor-intensive tasks execute on separate threads. Multithreading ist auch nützlich, wenn Sie skalierbare Aufgaben erstellen, da Sie Threads bei steigender Arbeitsauslastung hinzufügen können.Multithreading is also useful when you create scalable applications, because you can add threads as the workload increases.

Hinweis

Wenn Sie mehr Kontrolle über das Verhalten von Threads der Anwendung benötigen, können Sie die Threads selbst verwalten.If you need more control over the behavior of the application's threads, you can manage the threads yourself. Ab .NET Framework 4 wird die Multithreadprogrammierung durch die Klassen System.Threading.Tasks.Parallel und System.Threading.Tasks.Task, Parallel LINQ (PLINQ), neue parallele Sammlungsklassen im System.Collections.Concurrent-Namespace und ein neues Programmiermodell, das auf dem Konzept von Tasks anstatt von Threads basiert, erheblich vereinfacht.However, starting with the .NET Framework 4, multithreaded programming is greatly simplified with the System.Threading.Tasks.Parallel and System.Threading.Tasks.Task classes, Parallel LINQ (PLINQ), new concurrent collection classes in the System.Collections.Concurrent namespace, and a new programming model that is based on the concept of tasks rather than threads. Weitere Informationen finden Sie in den Artikeln zur parallelen Programmierung und zu Task Parallel Library (TPL).For more information, see Parallel Programming and Task Parallel Library (TPL).

Vorgehensweise: Erstellen und Starten eines neuen ThreadsHow to: Create and start a new thread

Sie können einen neuen Thread erstellen, indem Sie eine neue Instanz der System.Threading.Thread-Klasse erstellen und den Namen der Methode angeben, die Sie in einem neuen Thread an den Konstruktor ausführen möchten.You create a new thread by creating a new instance of the System.Threading.Thread class and providing the name of the method that you want to execute on a new thread to the constructor. Rufen Sie die Thread.Start-Methode auf, um einen erstellten Thread auszuführen.To start a created thread, call the Thread.Start method. Weitere Informationen und Beispiele finden Sie unter Erstellen von Threads und Übergeben von Daten zur Startzeit und in der Thread-API-Referenz.For more information and examples, see the Creating threads and passing data at start time article and the Thread API reference.

Vorgehensweise: Anhalten eines ThreadsHow to: Stop a thread

Verwenden Sie System.Threading.CancellationToken, um die Ausführung eines Threads zu beenden.To terminate the execution of a thread, use the System.Threading.CancellationToken. Mit dieser Methode lassen sich Threads kooperativ anhalten.It provides a unified way to stop threads cooperatively. Weitere Informationen finden Sie unter Abbruch in verwalteten Threads.For more information, see Cancellation in managed threads.

Manchmal ist es nicht möglich, einen Thread kooperativ anzuhalten, weil darin Drittanbietercode ausgeführt wird, der für einen kooperativen Abbruch nicht geeignet ist.Sometimes it is not possible to stop a thread cooperatively, because it runs third-party code not designed for cooperative cancellation. In diesem Fall müssen Sie die Beendigung der Ausführung möglicherweise erzwingen.In this case, you might want to terminate its execution forcibly. Um die Beendigung der Ausführung eines Threads zu erzwingen, können Sie in .NET Framework die Methode Thread.Abort verwenden.To terminate the execution of a thread forcibly, in .NET Framework you can use the Thread.Abort method. Diese Methode löst eine ThreadAbortException im Thread aus, in dem sie aufgerufen wird.That method raises a ThreadAbortException on the thread on which it's invoked. Weitere Informationen finden Sie unter Zerstören von Threads.For more information, see Destroying threads. Die Methode Thread.Abort wird in .NET Core nicht unterstützt.The Thread.Abort method is not supported in .NET Core. Wenn Sie die Beendigung der Ausführung von Drittanbietercode in .NET Core erzwingen müssen, führen Sie den Code in einem separaten Prozess aus und verwenden Process.Kill.If you need to terminate the execution of third-party code forcibly in .NET Core, run it in the separate process and use Process.Kill.

System.Threading.CancellationToken steht erst ab .NET Framework 4 zur Verfügung.The System.Threading.CancellationToken is not available before .NET Framework 4. Um einen Thread in einer älteren .NET Framework-Version anzuhalten, müssen Sie den kooperativen Abbruch mithilfe von Techniken zur Threadsynchronisierung manuell implementieren.To stop a thread in older .NET Framework versions, you should implement the cooperative cancellation manually using the thread synchronization techniques. Sie können beispielsweise das flüchtige (volatile) boolesche Feld shouldStop erstellen und damit anfordern, dass der vom Thread ausgeführte Code angehalten wird.For example, you can create the volatile boolean field shouldStop and use it to request the code executed by the thread to stop. Weitere Informationen finden Sie unter volatile in der C#-Referenz sowie unter System.Threading.Volatile.For more information, see volatile in C# Reference and System.Threading.Volatile.

Verwenden Sie die Thread.Join-Methode, damit der aufrufende Thread auf die Beendigung des Threads wartet, der angehalten wird.Use the Thread.Join method to make the calling thread wait for the termination of the thread being stopped.

Vorgehensweise: Anhalten oder Unterbrechen eines ThreadsHow to: Pause or interrupt a thread

Mit der Thread.Sleep-Methode können Sie den aktuellen Thread für bestimmte Zeit pausieren.You use the Thread.Sleep method to pause the current thread for a specified amount of time. Sie können einen blockierten Thread unterbrechen, indem Sie die Thread.Interrupt-Methode aufrufen.You can interrupt a blocked thread by calling the Thread.Interrupt method. Weitere Informationen finden Sie unter Pausing and interrupting threads (Anhalten und Unterbrechen von Threads).For more information, see Pausing and interrupting threads.

ThreadeigenschaftenThread properties

In der folgenden Tabelle werden einige Thread-Eigenschaften aufgeführt:The following table presents some of the Thread properties:

EigenschaftProperty BeschreibungDescription
IsAlive Gibt true zurück, wenn dieser Thread gestartet und ordnungsgemäß beendet bzw. abgebrochen wurde.Returns true if a thread has been started and has not yet terminated normally or aborted.
IsBackground Es wird ein boolescher Wert abgerufen oder festgelegt, der angibt, ob ein Thread ein Hintergrundthread ist.Gets or sets a Boolean that indicates if a thread is a background thread. Hintergrundthreads sind wie Vordergrundthreads, aber ein Hintergrundthread verhindert nicht, dass ein Prozess beendet wird.Background threads are like foreground threads, but a background thread doesn't prevent a process from stopping. Sobald alle zu einem Prozess gehörenden Vordergrundthreads beendet wurden, beendet die Common Language Runtime den Prozess, indem die Methode Abort in Hintergrundthreads aufgerufen wird, die noch aktiv sind.Once all foreground threads that belong to a process have stopped, the common language runtime ends the process by calling the Abort method on background threads that are still alive. Weitere Informationen finden Sie im Artikel zu Vordergrund- und Hintergrundthreads.For more information, see Foreground and Background Threads.
Name Ruft den Namen eines Threads ab oder legt diesen fest.Gets or sets the name of a thread. Wird am häufigsten beim Debuggen verwendet, um einzelne Threads zu erkennen.Most frequently used to discover individual threads when you debug.
Priority Es wird ein ThreadPriority-Wert abgerufen oder festgelegt, der vom Betriebssystem zum Priorisieren der Threadplanung verwendet wird.Gets or sets a ThreadPriority value that is used by the operating system to prioritize thread scheduling. Weitere Informationen finden Sie unter Scheduling Threads (Planen von Threads) und in der ThreadPriority-Referenz.For more information, see Scheduling threads and the ThreadPriority reference.
ThreadState Ruft einen ThreadState-Wert ab, der die aktuellen Zustände des Threads enthält.Gets a ThreadState value containing the current states of a thread.

Siehe auchSee also