2009-09-13 5 views
3

D'après la documentation et les articles, il est recommandé d'appeler Abort() sur un proxy client si une exception/erreur inattendue est rencontrée. Voir ci-après (simplifié):Peut appeler Abort() sur un proxy IClientChannel jeter une exception?

MyServiceClient proxy = null; 
try { 
    proxy = new MyServiceClient(); 
    proxy.DoSomething(); 
    proxy.Close(); 
} catch (Exception ex) { 
    if (proxy != null) 
     proxy.Abort(); 
} 

Est-il possible de l'appel à Abort() lancer une exception elle-même? L'appel à Abort() devrait-il être dans son propre essai/catch?

+0

Pourquoi avez-vous une valeur nulle dans cet extrait? –

+1

Je voulais mettre l'instanciation du proxy dans le bloc try. Ainsi, la vérification null dans le cas où quelque chose devait aller mal avec l'instanciation. Peut-être une surcharge, mais m'assure que j'ai un proxy pour Abandonner. – Elan

Répondre

3

Non, l'abandon n'échouera pas (mais .Close() ou .Dispose() peut). L'appel à .Abort() est l'approche du «sledgehammer» pour mettre fin à une chaîne - elle est simplement démantelée, indépendamment du traitement d'un message en cours.

Utilisez-le avec précaution, par ex. dans un cas de prise d'exception lors de l'appel de .Close() a échoué. C'est son vrai but et son bon usage.

Marc

+2

Que se passerait-il si vous n'appeliez pas abort sur le canal dans le bloc catch ci-dessus? –

+2

Le canal entre le client et le serveur ne serait pas correctement fermé et éliminé, vous risqueriez donc d'avoir un canal non utilisé dans votre système. En fin de compte, il sera collecté par les ordures, mais cela prend un certain temps, et jusque-là, il utilise des ressources système inutiles. –

+0

Avez-vous des références pour sauvegarder cette réclamation? Je veux être sûr qu'Abort ne lèvera aucune exception en aucune circonstance. –

Questions connexes