J'ai une fonction WCF qui s'exécute longtemps, donc j'appelle la fonction dans l'interface utilisateur avec backgraundworker ... Je veux donner une fonctionnalité pour annuler l'exécution, donc j'abandonne IComunicationObject, le problème est que l'exécution du service ne s'arrête pas , Y at-il un moyen d'arrêter l'exécution du service dans ce cas?comment annuler un appel de service WCF?
Répondre
Vous pouvez ne pas avoir besoin d'un BackgroundWorker. Vous pouvez effectuer l'opération IsOneWay ou implémenter le asynchronous pattern. Pour éviter les problèmes de thread, envisagez d'utiliser le SynchronizationContext. Programming WCF Services fait un excellent travail à expliquer ces.
Créez une méthode CancelOperation() qui définit un staticResetEvent statique dans votre service. Vérifiez fréquemment cet événement dans votre méthode de fonctionnement. Ou il peut être CancelOperation (Guid operationId) si votre service peut traiter plusieurs appels d'opération simultanément.
Merci pour la réponse! Est-ce une bonne pratique? ou juste un moyen de le faire? –
Juste un moyen de le faire, pas sûr s'il y a des «meilleures pratiques» –
Une chose importante à comprendre si vous utilisez les appels asynchrones est qu'il n'y a toujours aucun moyen d'annuler une demande et d'empêcher une réponse de revenir du service une fois qu'il a commencé. C'est à votre interface utilisateur d'être intelligent dans la gestion des réponses pour éviter les conditions de course. Heureusement, il existe un moyen simple de le faire.
Cet exemple permet de rechercher des commandes - pilotées par une interface utilisateur. Supposons que cela peut prendre quelques secondes pour renvoyer des résultats et que l'utilisateur exécute deux recherches consécutivement.
Par conséquent si votre utilisateur exécute deux recherches et la première recherche renvoie après la seconde - vous devez vous assurer que vous n'affichez pas les résultats de la première recherche.
private int _searchRequestID = 0; // need one for each WCF method you call
// Call our service...
// The call is made using the overload to the Async method with 'UserToken'.
// When the call completes we check the ID matches to avoid a nasty
// race condition
_searchRequestID = _searchRequestID++;
client.SearchOrdersCompleted += (s, e) =>
{
if (_searchRequestID != (int)e.UserState))
{
return; // avoid nasty race condition
}
// ok to handle response ...
}
client.SearchOrdersAsync(searchMessage, _searchRequestID);
Avez-vous trouvé une solution ?. Si oui, pouvez-vous le partager? –
@jmelosegui, non, je ne pouvais pas arrêter le serveur faire le travail, mais pour l'instant je comprends que c'est impossible, votre serveur devrait prendre en charge l'annulation, donc vous devriez avoir la fonctionnalité bagin/cancel côté serveur et annuler le serveur du client annuler –