Freigeben über


Gewusst wie: Asynchrones Aufrufen von Methoden für ein Remoteobjekt

Die asynchrone Programmierung stellt einen ebenso einfachen Prozess dar wie das Programmieren einer einzelnen Anwendungsdomäne.

So rufen Sie eine Methode für ein Remoteobjekt asynchron auf

  1. Erstellen Sie eine Instanz eines Objekts, das einen Remoteaufruf einer Methode empfangen kann.

  2. Schließen Sie diese Instanzmethode in ein AsyncDelegate-Objekt ein.

    Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurCallBack)
    
    AsyncCallback RemoteCallback = new AsyncCallback(this.OurCallBack);
    
  3. Schließen Sie die Remotemethode in einen anderen Delegaten ein.

    Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
    
    RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
    
  4. Rufen Sie die BeginInvoke-Methode für den zweiten Delegaten auf, und übergeben Sie Argumente, das AsyncDelegate-Objekt und ein Objekt zum Speichern des Zustands (bzw. einen NULL-Verweis oder Nothing in Visual Basic).

    Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, _
                                Nothing)
    
    IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
    
  5. Warten Sie, bis das Serverobjekt die Rückrufmethode aufruft.

    Dies ist die allgemeine Vorgehensweise, die Sie aber bis zu einem gewissen Grad abändern können. Wenn Sie zu einem bestimmten Zeitpunkt auf die Rückgabe eines bestimmten Aufrufs warten, verwenden Sie lediglich die vom Aufruf von BeginInvoke zurückgegebene IAsyncResult-Schnittstelle, rufen die WaitHandle-Instanz für dieses Objekt ab und rufen anschließend die WaitOne-Methode auf, wie mit folgendem Codebeispiel veranschaulicht.

    RemAr.AsyncWaitHandle.WaitOne()
    
    RemAr.AsyncWaitHandle.WaitOne();
    

    Alternativ können Sie in einer Schleife warten, die überprüft, ob der Aufruf abgeschlossen wurde. Sie können auch System.Threading-Primitive wie die ManualResetEvent-Klasse verwenden und anschließend den Aufruf selbst fertig stellen, wie mit folgendem Beispielcode veranschaulicht.

    If RemAr.IsCompleted Then
      Dim del As RemoteAsyncDelegate = CType(CType(RemAr, AsyncResult).AsyncDelegate, RemoteAsyncDelegate)
      Console.WriteLine(("SUCCESS: Result of the remote AsyncCallBack:" _
        + del.EndInvoke(RemAr)))
    ' Allow the callback thread to interrupt the primary thread to execute the callback.
    Thread.Sleep(1)
    End If ' Do something.
    
    if (RemAr.IsCompleted){
      RemoteAsyncDelegate del = (RemoteAsyncDelegate)((AsyncResult) RemAr).AsyncDelegate;
      Console.WriteLine("SUCCESS: Result of the remote AsyncCallBack: "  
        + del.EndInvoke(RemAr) );
    // Allow the callback thread to interrupt the primary thread to execute the callback.
    Thread.Sleep(1);
    }
    
  6. Schließlich können Sie den Hauptthread eine ManualResetEvent-Klasse erstellen und auf die Rückruffunktion warten lassen, die dann die ManualResetEvent-Klasse als letzte Zeile vor der Rückgabe kennzeichnet. Ein Beispiel für diese Art des Wartens finden Sie in den Quellcodekommentaren unter Remotingbeispiel: Asynchrones Remoting.

Siehe auch

Konzepte

Remotingbeispiel: Asynchrones Remoting
Konfiguration von Remoteanwendungen

Weitere Ressourcen

Übersicht über .NET Framework Remoting