Freigeben über


Threadsynchronisierung

Aktualisiert: November 2007

Beim Programmieren einer Threadanwendung müssen Sie u. U. einzelne Threads mit anderen Bestandteilen des Programms synchronisieren. Die Synchronisierung ermöglicht einen Kompromiss zwischen der unstrukturierten Multithreadprogrammierung und der strukturierten Reihenfolge bei der Synchronverarbeitung.

Synchronisierungsverfahren verwenden Sie zu folgenden Zwecken:

  • Die Reihenfolge der Codeausführung explizit steuern, wann immer Aufgaben in einer bestimmten Reihenfolge ausgeführt werden müssen.

    - oder -

  • Die Probleme verhindern, die auftreten können, wenn zwei Threads gleichzeitig dieselbe Ressource verwenden.

So können Sie mit der Synchronisierung beispielsweise eine Anzeigeprozedur veranlassen, die Beendigung einer Datenabrufprozedur abzuwarten, die in einem anderen Thread ausgeführt wird.

Synchronisierungsverfahren

Es gibt zwei Ansätze für die Synchronisierung: Abruf (Polling) und Synchronisierungs­objekte. Weitere Informationen zu Synchronisierungsobjekten finden Sie unter Erweiterte Synchronisierungsverfahren.

Abruf

Beim Abruf wird der Status eines asynchronen Aufrufs in einer Schleife wiederholt überprüft. Der Abruf stellt das am wenigsten effiziente Verfahren zum Verwalten von Threads dar, da hierbei durch die wiederholte Überprüfung des Status der verschiedenen Threadeigenschaften Ressourcen verschwendet werden.

Beispielsweise können Sie beim Abruf anhand der IsAlive-Eigenschaft überprüfen, ob ein Thread beendet wurde. Verwenden Sie diese Eigenschaft mit Bedacht, denn ein Thread, der aktiv ist, wird nicht notwendigerweise gerade ausgeführt.

Mit der ThreadState-Eigenschaft des Threads können Sie detailliertere Informationen über den Status eines Threads abrufen. Da ein Thread zu einem Zeitpunkt mehrere Zustandswerte aufweisen kann, kann der in ThreadState gespeicherte Wert eine Kombination aus den Werten in der System.Threading.ThreadState-Enumeration sein. Daher sollten Sie beim Abruf alle relevanten Threadstatuswerte sorgfältig überprüfen. Wenn der Zustandswert eines Threads z. B. angibt, dass der Thread nicht im Zustand Running ist, ist dieser möglicherweise abgeschlossen. Er kann aber auch angehalten oder im Ruhezustand sein.

Warten auf die Beendigung eines Threads

Mit der Thread.Join-Methode kann vor dem Starten eines anderen Tasks festgestellt werden, ob ein Thread abgeschlossen wurde. Bei der Join-Methode wird eine bestimmte Zeitspanne gewartet, bis ein Thread beendet wird. Wenn der Thread vor dem Timeout endet, gibt JoinTrue zurück, andernfalls False.

Wie Sie sich vorstellen können, werden beim Abruf viele der Vorteile des Multithreading geopfert, um die Reihenfolge der Threadausführung steuern zu können. Da der Abruf so ineffizient ist, wird er im Allgemeinen nicht empfohlen. Ein effizienterer Ansatz besteht in der Verwendung der Join-Methode zur Steuerung von Threads. Join veranlasst eine aufrufende Prozedur, entweder die Beendigung eines Threads oder das Timeout eines Aufrufs (falls ein Timeout angegeben ist) abzuwarten. Der Name der Methode, "Join" (verbinden), spiegelt die Idee wider, dass die Erstellung eines neuen Threads eine Gabelung im Ausführungspfad darstellt. Mit Join werden getrennte Ausführungspfade wieder zu einem einzelnen Thread zusammengeführt.

"Set" und "Join" für Threads

Abb. 1: Threading

Beachten Sie Folgendes: Join ist ein synchroner oder blockierender Aufruf. Nach dem Aufruf von Join oder einer wait-Methode eines wait-Handles hält die aufrufende Prozedur an und wartet, bis der Thread seine Beendigung signalisiert.

Sub JoinThreads()
    Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask)
    Thread1.Start()
    Thread1.Join()      ' Wait for the thread to finish.
    MsgBox("Thread is done")
End Sub
Sub SomeTask()
    ' Insert code to perform a task here.
End Sub

Diese einfachen Verfahren für die Steuerung von Threads sind hilfreich, wenn Sie eine kleine Anzahl an Threads verwalten, für umfangreiche Projekte sind sie jedoch schwierig zu verwenden. Unter Erweiterte Synchronisierungsverfahren werden einige Verfahren für die Threadsynchronisierung beschrieben.

Siehe auch

Konzepte

Erweitertes Multithreading mit Visual Basic

Parameter und Rückgabewerte für Multithreadprozeduren

Weitere Ressourcen

Multithreading in Visual Basic