IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

[WCF] Quand faut-il Close() le proxy ?


Sujet :

Silverlight

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut [WCF] Quand faut-il Close() le proxy ?
    Bonjour,

    J'ai fait pas mal de recherches mais je trouve beaucoup de réponses différentes ...

    J'aimerais savoir à quel moment il faut faire un closeAsync() d'un proxy, dans mon cas je crée un proxy par page (ou UserControl) et je vois pas trop à quelle moment (ou à quelle événement) je vais devoir CloseAsync(). J'aimerais savoir quelle la meilleur pratique à utiliser, comment gérez vous vos proxy ? Combien d'instances vous créez ? est ce que vous utilisez le CloseAsync() et à quelle moment.

    Merci

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Tu fais un Close dans les callback des méthodes qui sont appelées.

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Proxy p = new Proxy();
    p.SendAsyncCompleted = Test;
    p.SendAsync();
     
    private void Test(object sender, Args a)
    {
        (sender as Proxy).CloseAsync();
    }

  3. #3
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Normalement le Channel Factory ne s'en charge pas tout seul ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut
    Sachant que j'ai un proxy par page, si je le ferme dans les callbacks faudra que je le réouvre à chaque fois non ? C'est quoi l'intérêt d'avoir un proxy par appel ?

  5. #5
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Je ne suis pas un expert dans le domaine mais normalement les proxys sont bridés à 2 appels simultanément (un peu comme un navigateur). donc cela permet d'outre passer ce problème (qui n'en ai pas un) que de créer un nouveau proxy à chaque appel. De plus la connection à ton serveur n'a, la plus part du temps, pas besoin d'être up en permanence. Donc fermer le proxy le plus rapidement possible peut être une bonne pratique pour libérer des ressources.

  6. #6
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par DaMo` Voir le message
    Sachant que j'ai un proxy par page, si je le ferme dans les callbacks faudra que je le réouvre à chaque fois non ? C'est quoi l'intérêt d'avoir un proxy par appel ?
    D'une manière générale, c'est comme avec les bases de données: il faut ouvrir la connexion le plus tard possible et la fermer le plus tot possible.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut
    Donc juste histoire de résumer pour être sur, donc apparemment il vaut mieux créer un proxy à chaque appel, est ce que c'est donc quelque chose que vous faites en production peu importe le nombre d'appels WCF que vous allez faire ?

  8. #8
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Pour ma part oui et sans CloseAsync

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut
    Citation Envoyé par Samoteph Voir le message
    Pour ma part oui et sans CloseAsync
    Tu te désinscris juste de tes callbacks ?

  10. #10
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    exactement !

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut
    ok whaou sa va me faire mal aux dents de réécrire tout mes appels ....
    Est ce que tu t'es fait un petit wrapper pour gérer le proxy, ou est ce que tu crées juste un nouveau proxy avant chaque appel async ?

  12. #12
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    j'utilise une méthode statique qui me permet de récupérer le service. C'est assez pratique par exemple si tu veux fixer dynamiquement l'adresse du serveur auquel tu accèdes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public void Load()
    {
    MonService service = ServiceHelper.GetService(); // un nouveau service est renvoyé
    service.AppelMaMethodeCompleted += MaMethodeCompleted;
    service.AppelMaMethodeAsync();
    }
     
    public void MaMethodeCompleted(...)
    {
       service.AppelMaMethodeCompleted -= MaMethodeCompleted;
       ... traitement
    }

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut
    Oki, j'ai un gros doute si je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    MonService service;
    public void Load()
    {
    service = ServiceHelper.GetService(); // un nouveau service est renvoyé
    service.AppelMaMethodeCompleted += MaMethodeCompleted;
    service.AppelMaMethodeAsync();
     
    service = ServiceHelper.GetService(); // un nouveau service est renvoyé
    service.AppelAutreMaMethodeCompleted += AutreMaMethodeCompleted;
    service.AppelAutreMaMethodeAsync();
    }
     
    public void MaMethodeCompleted(...)
    {
       service.AppelMaMethodeCompleted -= MaMethodeCompleted;
       ... traitement
    }
     
    public void AutreMaMethodeCompleted(...)
    {
       service.AutreMaMethodeCompleted-= AutreMaMethodeCompleted;
       ... traitement
    }
    Est ce que sa fonctionnera sans problème ? Des problèmes comme des callbacks qui se perdent ou qui se retrouve dans un autre callback

  14. #14
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Aucun problème même si faire appel à la methode GetService deux fois sur un temps aussi cours n'a pas d'interêt.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void Load()
    {
    service = ServiceHelper.GetService(); // un nouveau service est renvoyé
    service.AppelMaMethodeCompleted += MaMethodeCompleted;
    service.AppelMaMethodeAsync();
     
    //service = ServiceHelper.GetService(); // un nouveau service est renvoyé
     
    service.AppelAutreMaMethodeCompleted += AutreMaMethodeCompleted;
    service.AppelAutreMaMethodeAsync();
    }
    Dans le deux cas cela fonctionne.

    Des problèmes comme des callbacks qui se perdent ou qui se retrouve dans un autre callback
    Si tu t'embrouille pense a l'evenement Click d'un Bouton, c'est le même principe.

  15. #15
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tiens çe me fait penser, dans l'appli qu'on fait au boulot on crée un client par appel mais et on utilise des delegate anonymes pour les Completed.

    Est-ce que mes objets sont quand même passés au GC ?

    Y'a pas un système de weak events ?

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut
    Oki merci beaucoup samoteph pour tes réponses, ainsi que thomas

    edit : oups skyounet qui a posté en même temps je close pas le topic

  17. #17
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Tiens çe me fait penser, dans l'appli qu'on fait au boulot on crée un client par appel mais et on utilise des delegate anonymes pour les Completed.

    Est-ce que mes objets sont quand même passés au GC ?
    Normalement, c'est source de MemoryLeaks car tu ne disposes pas d'une référence pour te désabonner.

    It is important to notice that you cannot easily unsubscribe from an event if you used an anonymous function to subscribe to it. To unsubscribe in this scenario, it is necessary to go back to the code where you subscribe to the event, store the anonymous method in a delegate variable, and then add the delegate to the event. In general, we recommend that you do not use anonymous functions to subscribe to events if you will have to unsubscribe from the event at some later point in your code. For more information about anonymous functions, see Anonymous Functions (C# Programming Guide).
    tiré de http://msdn.microsoft.com/en-us/library/ms366768.aspx

  18. #18
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Moi j'avais pris l'habitude de créer une variable statique dans la App.xaml.cs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static ServiceReference1.ServiceClient MonServiceClient { get; set; }
     
            public App()
            {
                this.Startup += this.Application_Startup;
                this.Exit += this.Application_Exit;
                this.UnhandledException += this.Application_UnhandledException;
     
     
                MonServiceClient = new ServiceReference1.ServiceClient();
     
                InitializeComponent();
            }
    Afin de pouvoir l'utiliser facilement dans n'importe qu'elle page sans avoir le reinstancier à chaque fois, ce n'est donc pas une bonne pratique du tout ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    App.MonServiceClient.GetMethodeCompleted +=...
    Si j'ai bien compris on instancie un ServiceClient à chaque fois que j'ai un appel de méthode (Async) à faire ??

  19. #19
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Moi j'avais pris l'habitude de créer une variable statique dans la App.xaml.cs
    Il est vrai que c'est assez tentant de créer le service une fois pour toute. Ton application devrait fonctionner normalement et se protège des problèmes de MemoryLeaks (car les abonnements aux evenements s'effectuent une seule fois). mais je n'ai jamais vu cette approche danc aucun des exemples vu sur le net.

    Outre la libération de ressources inutilement conservée et le nombre d'appel successif bridé (à vérifier) je pense que la raison principale est que le Channel crée par ton proxy n'est pas Thread safe. C'est à dire qu'il ne peut être appelé plusieurs fois en même temps sans se mettre, potentiellement, dans un état instable.

    Même si la chose me semble très probable, Comme je te l'ai dit au début du Thread, je ne suis pas un expert de WCF et j'aimerai bien avoir confirmation de ce que j'avance par une star.

  20. #20
    Membre éclairé Avatar de Mozofeuk
    Inscrit en
    Novembre 2007
    Messages
    326
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 326
    Par défaut
    Ton application devrait fonctionner normalement et se protège des problèmes de MemoryLeaks
    Mes applications fonctionnent très bien jusqu'à aujourd'hui mais si ce n'est pas propre j'aimerais savoir qu'elle est la bonne manière de procéder ??

    C'est quoi les problème de MémoryLeak ??

    je pense que la raison principale est que le Channel crée par ton proxy n'est pas Thread safe
    Là encore je crois ne pas tout avoir saisie désolé !!


    Cordialement MoZo

Discussions similaires

  1. Quand faut-il creer une autre instance ?
    Par flatron dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/02/2008, 20h34
  2. [MCT] (Quand) faut-il modéliser les traitements ?
    Par pepelele dans le forum Merise
    Réponses: 3
    Dernier message: 01/05/2007, 22h05
  3. XRC quand faut-il y passer?
    Par frouty dans le forum wxPython
    Réponses: 1
    Dernier message: 30/01/2007, 14h08
  4. Réponses: 5
    Dernier message: 20/10/2005, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo