Cómo llamar a métodos de objeto remoto de forma asincrónica
El proceso para la programación asincrónica es igual de sencillo que el utilizado para un dominio de una sola aplicación.
Para llamar a un método de objeto remoto de forma asincrónica
Cree una instancia de un objeto que pueda recibir una llamada remota a un método.
Englobe el método de instancia en un objeto AsyncDelegate.
Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurCallBack)
AsyncCallback RemoteCallback = new AsyncCallback(this.OurCallBack);
Englobe el método remoto en otro delegado.
Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
Llame al método BeginInvoke en el segundo delegado pasándole todos los argumentos, al objeto AsyncDelegate y a un objeto que contenga el estado (o una referencia nula; Nothing en Visual Basic).
Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, _ Nothing)
IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
Espere a que el objeto de servidor llame a su método de devolución de llamada.
Aunque éste es el enfoque general, puede variarlo hasta cierto punto. Si en un momento dado desea esperar a que se devuelva determinada llamada, tome la interfaz IAsyncResult que devolvió la llamada a BeginInvoke, recupere la instancia WaitHandle para ese objeto y llame al método WaitOne, tal y como se indica en el siguiente ejemplo de código.
RemAr.AsyncWaitHandle.WaitOne()
RemAr.AsyncWaitHandle.WaitOne();
O bien, espere en un bucle que comprueba si la llamada se ha realizado o mediante primitivas System.Threading como la clase ManualResetEvent y, a continuación, finalice la llamada usted mismo, tal y como se indica en el siguiente código de ejemplo.
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); }
Por último, puede hacer que su subproceso principal cree un ManualResetEvent y espere la función de devolución de llamada, que entonces indicará el ManualResetEvent como la última línea antes de volver. Para ver un ejemplo de este tipo de espera, vea los comentarios sobre código fuente en Ejemplo de interacción remota: Interacción remota asincrónica.
Vea también
Conceptos
Ejemplo de interacción remota: Interacción remota asincrónica
Configuración de aplicaciones remotas