Condividi tramite


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

  1. Creare un'istanza di un oggetto in grado di ricevere una chiamata remota a un metodo.

  2. 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);
    
  3. Eseguire il wrapping del metodo remoto mediante un altro delegato.

    Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
    
    RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
    
  4. 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);
    
  5. 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);
    }
    
  6. 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

Altre risorse

Cenni preliminari su .NET Framework Remoting