Procedura: chiamare i metodi di un oggetto remoto in modo asincrono
Il processo di programmazione asincrona è semplice come quello relativo a un singolo dominio di applicazione.
Per chiamare un metodo di un oggetto remoto in modo asincrono
Creare un'istanza di un oggetto in grado di ricevere una chiamata remota a un metodo.
Eseguire il wrapping del metodo di istanza mediante l'oggetto AsyncDelegate.
Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurCallBack)
AsyncCallback RemoteCallback = new AsyncCallback(this.OurCallBack);
Eseguire il wrapping del metodo remoto mediante un altro delegato.
Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
Chiamare il metodo BeginInvoke sul secondo delegato, passando gli eventuali argomenti, AsyncDelegate e alcuni oggetti per mantenere lo stato, oppure un riferimento null (Nothing in Visual Basic).
Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, _ Nothing)
IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
Attendere che l'oggetto server chiami il metodo di callback.
Questo approccio generale può essere modificato in parte. Se in qualsiasi momento si desidera attendere la restituzione di una determinata chiamata, è sufficiente accettare l'interfaccia IAsyncResult restituita dalla chiamata di BeginInvoke, recuperare l'istanza di WaitHandle per l'oggetto specifico, quindi chiamare il metodo WaitOne, come illustrato in questo esempio di codice.
RemAr.AsyncWaitHandle.WaitOne()
RemAr.AsyncWaitHandle.WaitOne();
In alternativa, è possibile attendere in un ciclo che consente di controllare se la chiamata è stata completata oppure utilizzare primitive System.Threading, ad esempio la classe ManualResetEvent, quindi terminare la chiamata, come illustrato in questo esempio di codice.
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); }
Infine, è possibile far sì che il thread principale crei un oggetto ManualResetEvent e attenda la funzione di callback, la quale segnala quindi tale oggetto come ultima riga prima del completamento. Per un esempio di questo tipo di attesa, vedere i commenti al codice sorgente in Esempio di codice di .NET Remoting: programmazione asincrona in .NET Remoting.
Vedere anche
Concetti
Esempio di codice di .NET Remoting: programmazione asincrona in .NET Remoting
Configurazione di applicazioni remote