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
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();
Umschließen Sie die Rückrufmethode mit einem AsyncCallback-Objekt.
Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurRemoteAsyncCallback)
AsyncCallback RemoteCallback = new AsyncCallback(this.OurRemoteAsyncCallback);
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);
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);
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