(En supposant une méthode WCF appelée « MaFonction »)Quelle est la meilleure façon d'annuler une requête WCF asynchrone?
Actuellement, pour soutenir l'annulation d'une demande WCF, j'utilise les méthodes BeginMyFunction/de EndMyFunction générés par svcutil (et la manipulation d'un drapeau isCanceled lors de la répartition des résultats au principal fil). Je voudrais utiliser la méthode MyFunctionAsync (et l'ancrage dans l'événement MyFunctionAsyncCompleted à la place) pour les appels async au lieu de Begin/End. Quelle est la meilleure façon de traiter les demandes WCF en cas d'utilisation de MyFunctionAsyncCompleted, tout en veillant à ce que l'événement ne soit pas déclenché sur une page qui n'est plus chargée (c'est-à-dire la navigation dans une image).
Merci!
EDIT:
J'ai décidé que je veux créer mon objet WcfClient sur une base par appel (par opposition à par-WPF-page ou par application), voici donc ce que je J'ai trouvé:
public void StartValidation(){
WcfClient wcf = new WcfClient();
wcf.IsValidCompleted += new EventHandler<IsValidCompletedEventArgs>(wcf_IsValidCompleted);
//pass the WcfClient object as the userState parameter so it can be closed later
wcf.IsValidAsync(TextBox.Text, wcf);
}
void wcf_IsValidCompleted(object sender, IsValidCompletedEventArgs e) {
if(!m_IsCanceled){
//Update the UI
//m_IsCanceled is set to true when the page unload event is fired
}
//Close the connection
if (e.UserState is WcfClient) {
((WcfClient)e.UserState).Close();
}
}
Je trouve difficile de trouver la méthode recommandée pour accomplir ce que je viens de mettre en œuvre. Est-ce que c'est bien tel quel, ou y a-t-il des pièges/des cas limites dont je dois m'inquiéter? Quelle est la norme d'or quand il s'agit d'annuler correctement un appel WCF?
De cette façon, vous n'êtes pas annulez vraiment l'appel (c'est-à-dire qu'il est encore en cours d'exécution.) Vous vérifiez simplement si vous devez ignorer les résultats, non? – GuyBehindtheGuy
Très vrai. Ce droit garantit qu'au moins mon interface utilisateur n'est pas mise à jour après le déchargement de la page. J'étudie la séquence d'appels que je devrais effectuer dans l'événement de déchargement (par exemple, Fermer, Abandonner, etc.) pour contourner cette technique de "marquage" que j'utilise actuellement. – Pwninstein
L'appel de 'Abort' sur un déchargement n'annule pas toujours la requête (en fait, la requête se termine presque toujours, Fiddler le prouve). J'ai ajouté un délai de 5 secondes sur le serveur pour me donner le temps d'annuler l'appel. Ce n'est pas ce à quoi je m'attendrais. – Pwninstein