Cómo: Llamar de forma asincrónica a los métodos de un objeto remoto

Este tema es específico de una tecnología heredada que se mantiene para la compatibilidad con versiones anteriores con aplicaciones existentes y no se recomienda para nuevo desarrollo. Las aplicaciones distribuidas se deberían desarrollar utilizando  Windows Communication Foundation (WCF).

El proceso para la programación asincrónica es tan sencillo como el proceso de un dominio de aplicación único.

Para llamar de forma asincrónica a un método de un objeto remoto

  1. Cree una instancia de un objeto que puede recibir una llamada remota a un método.

    Dim obj as ServiceClass = new ServiceClass()
    
    ServiceClass obj = new ServiceClass();
    
  2. Ajuste el método de devolución de llamada con un objeto AsyncCallback.

    Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurRemoteAsyncCallback)
    
    AsyncCallback RemoteCallback = new AsyncCallback(this.OurRemoteAsyncCallback);
    
  3. Ajuste el método remoto que desea llamar de forma asincrónica con un delegado adecuado.

    Delegate Function RemoteAsyncDelegate() As String
    Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
    
    public delegate string RemoteAsyncDelegate();
    RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
    
  4. Llame al método BeginInvoke en el segundo delegado, pasando cualquier argumento, algún objeto y AsyncDelegateal estado del bloqueo (o una referencia nula. Nada en Visual Basic).

    Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, Nothing)
    
    IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
    
  5. Espere para que el objeto remoto llame a su método de devolución de llamada.

    Aunque éste es el enfoque general, puede variarlo hasta cierto punto. Si desea esperar la devolución de una llamada determinada, tome la interfaz IAsyncResult que se devolvió de la llamada a BeginInvoke, recupere la instancia WaitHandle de dicho objeto y llame al método WaitOne como se muestra en el siguiente ejemplo de código.

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

    Alternativamente, puede esperar en un bucle que comprueba si la llamada se ha completado como se muestra en el siguiente código de ejemplo.

    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);
    }
    

    Por último, puede hacer que su subproceso principal cree ManualResetEvent y esperar en la función de devolución de llamada, que a continuación, señala ManualResetEvent como la última línea antes de devolver. Para obtener un ejemplo de este tipo de espera, vea los comentarios del código fuente en Ejemplo de comunicación remota: Comunicación remota asincrónica.

Vea también

Conceptos

Ejemplo de comunicación remota: comunicación remota asincrónica
Configuración de aplicaciones remotas

Otros recursos

Información general de servicios remotos de .NET Framework

Fecha de compilación: 2010-02-13