2011-10-07 4 views
2

Je dois pouvoir annuler les appels asynchrones effectués sur mon service Web. Une solution que j'ai est d'utiliser gérer mes propres threads, et utiliser des méthodes synchrones à partir du client SOAP. Cela fonctionne très bien et nécessite une gestion plus fine du fil.Annuler les appels de service Web asynchrones

Si j'utilisé l'un de ces deux motifs fournis par l'ajout d'une référence de service Web, par exemple:

var Client = new ASL_WS.SvcSoapClient() 
IAsyncResult result = Client.BeginAuthenticateUser(Email, Password, new AsyncCallback(AuthCompleted)); 

ou

var Client = new ASL_WS.SvcSoapClient() 
Client.AuthenticateUserCompleted += AuthCompleted; 
Client.AuthenticateUserAsync(Email, Passsword); 

font l'une de ces deux modèles me donner un moyen d'annuler la demande? Un cas d'utilisation peut être: un utilisateur se connecte mais souhaite annuler avant la fin de l'appel d'authentification.

Bien sûr, je pourrais implémenter cela différemment en modifiant le asyncState passé à ces appels, et en le paramétrant pour désactiver la mise à jour de l'interface utilisateur, mais ce n'est pas ce que je cherche. Pourrais-je simplement annuler toutes les opérations en cours? Est-ce que Client.Abort() annule de telles opérations? Que se passe-t-il si de nombreuses demandes asynchrones sont annulées? Y a-t-il d'autres méthodes d'API qui peuvent le faire?

Répondre

6

Oui, vous pouvez utiliser la méthode Abandon mais gardez les notes ci-dessous à l'esprit. Vous pouvez également utiliser CancelAsync.

Abandonner notes: http://msdn.microsoft.com/en-us/library/aa480512.aspx

Lorsque vous appelez la méthode Abandonner, toutes les demandes en suspens seront encore complète, mais ils termineront avec une faute. Cela signifie que si vous utilisez des rappels, votre fonction de rappel sera toujours appelée pour chaque requête en attente. Lorsque la méthode EndInvoke est appelée, ou dans notre cas, la fonction wrapper EndDelayedResponse, une erreur est générée indiquant que la connexion sous-jacente a été fermée.

CancelAsync exemple: http://www.codeproject.com/KB/cpp/wsasync.aspx

+1

sens. Il m'a fallu un certain temps pour comprendre ce que le code faisait, mais c'est assez évident maintenant. J'ai fini par faire quelque chose de similaire. Merci. – Candide

Questions connexes