Vorgehensweise: Asynchrones Aufrufen der Methoden eines Remoteobjekts

Dieses Thema bezieht sich auf eine veraltete Technologie, die zum Zwecke der Abwärtskompatibilität mit vorhandenen Anwendungen beibehalten wird und nicht für die neue Entwicklung empfohlen wird. Verteilte Anwendungen sollten jetzt mit  Windows Communication Foundation (WCF) entwickelt werden.

Der Prozess für die asynchrone Programmierung ist so einfach wie der für eine einzelne Anwendungsdomäne.

So rufen Sie eine Methode eines Remoteobjekts asynchron auf

  1. Erstellen Sie eine Instanz eines Objekts, das einen Remoteaufruf für eine Methode empfangen kann.

    Dim obj as ServiceClass = new ServiceClass()
    
    ServiceClass obj = new ServiceClass();
    
  2. Umschließen Sie die Rückrufmethode mit einem AsyncCallback-Objekt.

    Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurRemoteAsyncCallback)
    
    AsyncCallback RemoteCallback = new AsyncCallback(this.OurRemoteAsyncCallback);
    
  3. Umschließen Sie die Remotemethode, die Sie asynchron aufrufen möchten, mit einem entsprechenden Delegaten.

    Delegate Function RemoteAsyncDelegate() As String
    Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
    
    public delegate string RemoteAsyncDelegate();
    RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
    
  4. Rufen Sie die BeginInvoke-Methode auf dem zweiten Delegaten auf, und übergeben Sie dabei alle Argumente, AsyncDelegate und ein Objekt an den Haltestatus (oder an den NULL-Verweis – Nothing in Visual Basic).

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

    Dies ist die allgemeine Vorgehensweise, die Sie jedoch zu einem bestimmten Grad abwandeln können. Wenn Sie an einem bestimmten Punkt auf die Rückgabe eines bestimmten Aufrufs warten wollen, verwenden Sie einfach die IAsyncResult-Schnittstelle, die vom BeginInvoke-Aufruf zurückgegeben wurde, rufen die WaitHandle-Instanz für dieses Objekt ab, und rufen dann die WaitOne-Methode auf, wie im folgenden Codebeispiel gezeigt.

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

    Alternativ können Sie auch in einer Schleife warten, die überprüft, ob der Aufruf abgeschlossen wurde, wie im folgenden Beispielcode gezeigt.

    Dim count As Integer = 0
    While Not RemAr.IsCompleted
      Console.Write("Not completed -- " & count & vbCr)
      count += 1
      Thread.Sleep(New TimeSpan(TimeSpan.TicksPerMillisecond))
    End While
    
    int count = 0;
    while (!RemAr.IsCompleted)
    {
        Console.Write("\rNot completed: " + (++count).ToString());
        Thread.Sleep(1);
    }
    

    Schließlich können Sie den Hauptthread veranlassen, ein ManualResetEvent zu erstellen und auf die Rückruffunktion zu warten, wodurch dann angegeben wird, dass ManualResetEvent die letzte Zeile vor dem Zurückgeben ist. Ein Beispiel für diesen Typ des Wartevorgangs finden Sie in den Quellcodekommentaren in Remotingbeispiel: Asynchrones Remoting.

Siehe auch

Konzepte

Remotingbeispiel: Asynchrones Remoting
Konfiguration von Remoteanwendungen

Weitere Ressourcen

Übersicht über .NET Framework-Remoting

Erstellungsdatum: 2010-02-13