Gewusst wie: Bearbeiten von Steuerelementen aus Threads

Aktualisiert: November 2007

Obwohl die BeginInvoke-Methode durch die BackgroundWorker-Komponente ersetzt und funktionell erweitert wird, wird die BeginInvoke-Methode sowohl aus Gründen der Abwärtskompatibilität als auch, falls gewünscht, für die zukünftige Verwendung beibehalten. Weitere Informationen finden Sie unter Übersicht über die BackgroundWorker-Komponente.

Um rechenintensive Prozeduren von Klassenmodulen auszuführen, eignet sich am besten das Multithreadingverfahren. Im Unterschied zu anderen Komponenten können Probleme auftreten, wenn Methoden in Steuerelementen aus verschiedenen Threads aufgerufen werden. Methoden, die sich auf Steuerelemente auswirken, sollten nur auf dem Thread ausgeführt werden, auf dem das Steuerelement erstellt wurde. Da Systemressourcen stark beansprucht werden, wenn Aufrufe von einem Thread aus gemarshallt und über die Threadgrenzen hinaus an einen anderen Thread gesendet werden, sollten Sie es vermeiden, Steuerelemente auf anderen Threads wiederholt aufzurufen. Im günstigsten Fall sind direkte Aufrufe aus anderen Threads ressourcenintensiv, was sich negativ auf die Verarbeitungsgeschwindigkeit der Anwendung auswirkt. Im ungünstigsten Fall können Bedingungen eintreten, die ein Deadlock in der Anwendung verursachen und die Ausführung einfrieren.

In bestimmten Situationen kann es sich jedoch ergeben, dass Sie Methoden in Steuerelementen von anderen Threads aus aufrufen möchten. Beispielsweise könnten Sie als Reaktion auf eine Aktion, die von einem Thread ausgeführt wurde, eine Methode aufrufen, die eine Schaltfläche deaktiviert oder eine Anzeige in einem Formular aktualisiert. .NET Framework stellt Methoden bereit, die von jedem beliebigen Thread aus ohne Sicherheitsrisiko aufgerufen werden können und die ihrerseits Methoden aufrufen, die mit Steuerelementen anderer Threads interagieren. Die Invoke-Methode ermöglicht die synchrone Ausführung von Methoden für Steuerelemente, während die BeginInvoke-Methode die asynchrone Ausführung startet. Um diese Methoden zu verwenden, müssen Sie einen Delegaten deklarieren, der dieselbe Signatur wie die aufzurufende Methode besitzt. Anschließend können Sie die Invoke-Methode oder BeginInvoke-Methode jedes im Formular enthaltenen Steuerelements aufrufen, indem Sie den entsprechenden Delegaten für die aufzurufende Methode angeben. Alle erforderlichen Parameter werden in ein Object eingeschlossen und an die Methode übermittelt.

So rufen Sie Methoden mit Steuerelementen auf, die anderen Threads zugehörig sind

  1. Deklarieren Sie einen Delegaten mit einer Signatur, die mit derjenigen der aufzurufenden Methode identisch ist.

    Im folgenden Beispiel wird gezeigt, wie ein Delegat mit den Parametern Integer und String deklariert wird.

    Public Delegate Sub myDelegate(ByVal anInteger as Integer, ByVal _
       aString as String)
    
    public delegate void myDelegate(int anInteger, string aString);
    
  2. Verwenden Sie ein beliebiges Steuerelement, um Methoden aufzurufen, die anderen Threads zugehörige Steuerelemente bearbeiten.

    Hinweis:

    Falls die Methode Parameter benötigt, können diese in einem Object bereitgestellt werden.

    • Wenn Sie Methoden synchron aufrufen möchten, rufen Sie die Control.Invoke-Methode auf.

      Label1.Invoke(New myDelegate(AddressOf myMethod), New _
         Object() {1, "This is the string"})
      
      Label1.Invoke(new myDelegate(myMethod), new Object[] {1,
         "This is the string"});
      
    • Wenn Sie Methoden asynchron aufrufen möchten, rufen Sie die Control.BeginInvoke-Methode auf.

      Label1.BeginInvoke(New myDelegate(AddressOf myMethod), _
         New Object() {1, "This is the string"})
      
      Label1.BeginInvoke(new myDelegate(myMethod), new 
      Object[] {1, "This is the string"});
      

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Erstellen einer einfachen Multithreadkomponente mit Visual Basic

Exemplarische Vorgehensweise: Erstellen einer einfachen Multithreadkomponente mit Visual C#

Konzepte

Übersicht über ereignisbasierte asynchrone Muster

Referenz

BackgroundWorker

Weitere Ressourcen

Multithreading in Komponenten