Partager via


Comment : Appeler les méthodes d'un objet distant asynchrone

Le processus de programmation asynchrone est aussi simple que celui d'un domaine d'application unique.

Pour appeler une méthode d'un objet distant asynchrone

  1. Créez une instance d'un objet qui peut recevoir un appel distant à une méthode.

  2. Enveloppez cette méthode d'instance à l'aide d'un objet AsyncDelegate.

    Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurCallBack)
    
    AsyncCallback RemoteCallback = new AsyncCallback(this.OurCallBack);
    
  3. Enveloppez la méthode distante à l'aide d'un autre délégué.

    Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
    
    RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
    
  4. Appelez la méthode BeginInvoke sur le deuxième délégué, en passant des arguments, AsyncDelegate et des objets pour maintenir l'état (ou une référence null, Nothing en Visual Basic).

    Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, _
                                Nothing)
    
    IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
    
  5. Attendez que l'objet serveur appelle votre méthode de rappel.

    Bien qu'il s'agisse de l'approche générale, celle-ci peut varier dans une certaine mesure. Si, à tout moment, vous souhaitez attendre qu'un appel particulier soit retourné, vous prenez simplement l'interface IAsyncResult retournée à partir de l'appel BeginInvoke, extrayez l'instance WaitHandle pour cet objet et appelez la méthode WaitOne comme le montre l'exemple de code suivant.

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

    Vous pouvez également attendre, soit dans une boucle qui vérifie si l'appel a abouti, soit en utilisant les primitives System.Threading telles que la classe ManualResetEvent, puis finir l'appel vous-même, comme illustré dans l'exemple de code suivant.

    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. Enfin, votre thread principal peut créer ManualResetEvent et attendre la fonction de rappel qui signale ensuite ManualResetEvent comme étant la dernière ligne avant le retour. Pour obtenir un exemple de ce type d'attente, consultez les commentaires de code source dans Exemple d'accès distant : Accès distant asynchrone

Voir aussi

Concepts

Exemple d'accès distant : Accès distant asynchrone
Configuration d'applications distantes

Autres ressources

Vue d'ensemble de .NET Framework Remoting