Comment : appeler de façon asynchrone les méthodes d'un objet distant
Cette rubrique est spécifique à la technologie héritée assurant la compatibilité descendante avec des applications existantes et n'est pas recommandée en cas de nouveau développement. Les applications distribuées doivent maintenant être développées à l'aide de Windows Communication Foundation (WCF).
Le processus de programmation asynchrone est aussi simple que celui d'un domaine d'application unique.
Pour appeler de façon asynchrone une méthode d'un objet distant
Créez une instance d'un objet qui peut recevoir un appel distant à une méthode.
Dim obj as ServiceClass = new ServiceClass()
ServiceClass obj = new ServiceClass();
Encapsulez la méthode de rappel avec un objet AsyncCallback .
Dim RemoteCallback As New AsyncCallback(AddressOf Me.OurRemoteAsyncCallback)
AsyncCallback RemoteCallback = new AsyncCallback(this.OurRemoteAsyncCallback);
Encapsulez la méthode distante que vous souhaitez appeler, de façon asynchrone, avec un délégué approprié.
Delegate Function RemoteAsyncDelegate() As String Dim RemoteDel As New RemoteAsyncDelegate(AddressOf obj.RemoteMethod)
public delegate string RemoteAsyncDelegate(); RemoteAsyncDelegate RemoteDel = new RemoteAsyncDelegate(obj.RemoteMethod);
Appelez la méthode BeginInvoke sur le deuxième délégué, en passant les arguments nécessaires, AsyncDelegate et des objets permettant de conserver l'état (ou une référence Null — Nothing en langage Visual Basic).
Dim RemAr As IAsyncResult = RemoteDel.BeginInvoke(RemoteCallback, Nothing)
IAsyncResult RemAr = RemoteDel.BeginInvoke(RemoteCallback, null);
Attendez que l'objet distant appelle votre méthode de rappel.
Bien qu'il s'agisse de l'approche générale, vous pouvez apporter quelques variations. Si vous souhaitez, à un moment ou un autre, attendre le retour d'un appel particulier, il suffit d'utiliser l'interface IAsyncResult retournée par l'appel BeginInvoke, de récupérer l'instance WaitHandle pour cet objet et d'appeler la méthode WaitOne comme indiqué dans l'exemple de code suivant.
RemAr.AsyncWaitHandle.WaitOne()
RemAr.AsyncWaitHandle.WaitOne();
L'autre solution consiste à attendre l'exécution d'une boucle qui vérifie si l'appel a abouti comme indiqué dans l'exemple de code suivant.
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); }
Enfin, vous pouvez demander à votre thread principal de créer un ManualResetEvent et attendre l'exécution de la fonction de rappel qui signalera alors l'objet ManualResetEvent sur la dernière ligne avant de procéder au retour. Pour obtenir un exemple de ce type d'attente, consultez les commentaires de code source dans Exemple de communication à distance : communication à distance asynchrone.
Voir aussi
Concepts
Exemple de communication à distance : communication à distance asynchrone
Configuration d'applications distantes
Autres ressources
Vue d'ensemble de .NET Framework Remoting
Date de génération : 2010-02-13