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 :

SL3 - Problème d'appel asynchrone


Sujet :

Silverlight

  1. #1
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut SL3 - Problème d'appel asynchrone
    Hello tout le monde
    J'ai un service WCF qui expose 3 méthodes dont 2 retournent qqchose.
    J'ai une appli SL3 dans laquelle un Timer appelle ces 3 méthodes en asynchrone toutes les 3 secondes.

    Un peu de code:

    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
    25
    26
    27
    28
    public void StartTimer()
            {
                var myDispatcherTimer = new System.Windows.Threading.DispatcherTimer();
                myDispatcherTimer.Interval = new TimeSpan(0, 0, 0, 3); // 3 sec
                myDispatcherTimer.Tick += new EventHandler(Each_Tick);
                myDispatcherTimer.Start();
            }
     
            public void Each_Tick(object o, EventArgs sender)
            {
                try
                {
                    var client = new ServiceBlotter.ServiceBlotterSLClient();
     
                    client.PublishHeartbeatCompleted += null;
                    client.PublishHeartbeatAsync(app.LoginTrader);
     
                    client.GetIdRfqsAliveCompleted += new EventHandler<BlotterLightCNCE.Silverlight.ServiceBlotter.GetIdRfqsAliveCompletedEventArgs>(client_GetIdRfqsAliveCompleted);
                    client.GetIdRfqsAliveAsync(app.LoginTrader);
     
                    client.GetLastIdRfqDealDoneCompleted += new EventHandler<BlotterLightCNCE.Silverlight.ServiceBlotter.GetLastIdRfqDealDoneCompletedEventArgs>(client_GetLastIdRfqDealDoneCompleted);
                    client.GetLastIdRfqDealDoneAsync();
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
    J'essaie de simuler un TimeOut lors de l'appel à mon WCF.
    Pour cela, j'ai réglé le TimeOut à 2 secondes dans ma config WCF côté SL et dans ma fonction GetIdRfqsAlive côté service, j'ai mis un Thread.Sleep(5000).

    Mon problème est que l'appel à la fonction GetLastIdRfqDealDone tombe également en TimeOut.

    Une idée?
    Thx

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ben oui tu fais un Thread.Sleep dans ton service, et comme tes 3 méthodes doivent probablement utiliser la même instance de ton service tu bloques toutes celles après donc dans ton cas GetLastIdRfqDealDone.

    Alors soit il faut configurer ton WCF pour utiliser une instance par call de méthode ou alors peut-être qu'en new ServiceBlotter.ServiceBlotterSLClient() pour chaque call ça peut passer.

  3. #3
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    Ben oui tu fais un Thread.Sleep dans ton service, et comme tes 3 méthodes doivent probablement utiliser la même instance de ton service tu bloques toutes celles après donc dans ton cas GetLastIdRfqDealDone.
    C'est vraiment comme ça que ça marche ???
    Je suis trop habitué à l'ASP.NET où IIS gère chaque requête dans un thread différent apparemment

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    C'est vraiment comme ça que ça marche ???
    Je suis trop habitué à l'ASP.NET où IIS gère chaque requête dans un thread différent apparemment
    Ben oui quand tu fais ton new de ton proxy ça ouvre un tunnel jusqu'à ton serveur et là toutes tes requêtes utiliseront la même instance derrière donc si tu bloques le retour d'une d'entre elles, tu bloques le tunnel.

    Me rappelle plus du mode par défaut mais essaye en instanciant un nouveau proxy avant chaque call. Si ça marche pas rajoute InstanceContextMode = InstanceContextMode.PerCall dans l'attribut ServiceBehavior de ton service.

  5. #5
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Ok, j'essaierai ça demain

    Merci à toi

  6. #6
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par Skyounet Voir le message
    ou alors peut-être qu'en new ServiceBlotter.ServiceBlotterSLClient() pour chaque call ça peut passer.
    J'ai créé 3 clients, un pour chaque méthode appelée.
    Ca change pas le problème.

    Reste la solution de la config WCF, je vais chercher de ce côté

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par lutecefalco Voir le message
    J'ai créé 3 clients, un pour chaque méthode appelée.
    Ca change pas le problème.

    Reste la solution de la config WCF, je vais chercher de ce côté
    Bon ben dans l'attribut ServiceBehavior de ton Service, rajoute
    InstanceContextMode = InstanceContextMode.PerCall
    comme paramètre.

  8. #8
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Pas mieux

  9. #9
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Apres ton timeout, ton channel est pas en faulted?

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 220
    Points
    220
    Par défaut
    Regarde du coté de ConcurrencyMode http://msdn.microsoft.com/en-us/libr...rencymode.aspx
    Essaie de te mettre en ConcurrencyMode.Multiple pour voir

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    C'est quoi l'objectif final derrière ? Pkoi tu veux faire ca ?

  12. #12
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par matdur Voir le message
    Regarde du coté de ConcurrencyMode http://msdn.microsoft.com/en-us/libr...rencymode.aspx
    Essaie de te mettre en ConcurrencyMode.Multiple pour voir
    Pas mieux

    Citation Envoyé par PitMaverick78 Voir le message
    Apres ton timeout, ton channel est pas en faulted?
    Nop

  13. #13
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    C'est quoi l'objectif final derrière ? Pkoi tu veux faire ca ?
    J'ai des problèmes de TimeOut en prod qui font planter mon appli SL.
    Donc je fais des tests pour creuser un peu le fonctionnement de WCF là.

    Et en ce moment, je pige pas pourquoi l'appel à une fonction qui prend 5 secondes bloque les autres appels

  14. #14
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Bon, j'ai passé une partie de mon aprem dessus.
    Après avoir analysé les échanges réseaux avc Fiddler, je me suis rendu compte que c'était la partie Silverlight qui ne faisait pas les appels au service WCF (même avec une serviceMethode différente et un client différent) tant qu'elle n'avait pas reçu la réponse.
    Au début, je me suis dit que le thread UI devait locké qqchose ou un truc dans le genre. J'ai donc déporté tous mes appels au service WCF dans un backgroundWorker. Aucune amélioration

    Dernière piste qui me vient à l'esprit (attention, elle est peut être complétement fausse étant donné mes connaissances dans les protocoles ):
    je me dis que le fait d'utiliser plusieurs clients même avec le même end point fait qu'on utilise une seule et unique connexion.
    Lorsque j'appelle ma fonction qui prend 5 secondes, je me dis que SL ouvre une connexion et la garde ouverte jusqu'à la réponse, d'où l'impossibilité de faire un autre appel WCF pendant ce moment là.
    Question: est-ce que c'est bien comme ça que cela marche? Ou alors SL ferme la connexion après l'appel asynchrone au service WCF et c'est le service qui est capable de rouvrir une connexion lors du call back?

  15. #15
    Membre émérite
    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 : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    Bonjour,

    Je me demande si AsyncPattern ne pourrait pas t'aider dans ton cas.

    http://stackoverflow.com/questions/2...tattribute-wcf

    EDITO : non en fait je ne pense pas

  16. #16
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    J'ai créé 3 services WCF (1 pour chaque méthode appelée)
    Cote SL, j'ai créé 3 clients (1 par service WCF)

    Même problème ...

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Points : 135
    Points
    135
    Par défaut
    Je peux juste te proposer d'essayer un truc si c'est pas déjà le cas :

    If you don’t call the “Open” method first, the proxy would be opened internally when the first call is made on the proxy. This is called auto-open.

    Why? When the first message is sent through the auto-opened proxy, it will cause the proxy to be opened automatically. You can use .NET Reflector to open the method System.ServiceModel.Channels.ServiceChannel.Call and see the following code:

    if (!this.explicitlyOpened)

    {

    this.EnsureDisplayUI();

    this.EnsureOpened(rpc.TimeoutHelper.RemainingTime());

    }

    When you drill down into EnsureOpened, you will see that it calls CallOnceManager.CallOnce. For non-first calls, you would hit SyncWait.Wait which waits for the first request to complete. This mechanism is to ensure that all requests wait for the proxy to be opened and it also ensures the correct execution order. Thus all requests are serialized into a single execution sequence until all requests are drained out from the queue. This is not a desired behavior in most cases.

    To avoid such “serializing” artifact, the best practice is to open the proxy explicitly as above. Once you get to this point, you will be able to share the same proxy object among multiple threads.

  18. #18
    Rédacteur
    Avatar de lutecefalco
    Profil pro
    zadzdzddzdzd
    Inscrit en
    Juillet 2005
    Messages
    5 052
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : zadzdzddzdzd

    Informations forums :
    Inscription : Juillet 2005
    Messages : 5 052
    Points : 8 734
    Points
    8 734
    Par défaut
    Ton post semblait prometteur, mais en fait non

  19. #19
    Membre émérite
    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 : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Points : 2 682
    Points
    2 682
    Par défaut
    ne te fie pas au titre du post, la dernière réponse t'aidera peut être :

    http://stackoverflow.com/questions/2...-silverlight-3

Discussions similaires

  1. [wcf][débutant] Problème d'appel asynchrone et synchone.
    Par volontier dans le forum Windows Communication Foundation
    Réponses: 13
    Dernier message: 11/08/2010, 10h41
  2. Problème appels asynchrones à un WCF avec SilverLight 3
    Par Throna dans le forum Silverlight
    Réponses: 9
    Dernier message: 03/06/2010, 17h03
  3. Autre contexte mais tjs problème d'appel fct interne
    Par Neilos dans le forum C++Builder
    Réponses: 1
    Dernier message: 28/08/2004, 13h51
  4. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30
  5. Réponses: 4
    Dernier message: 19/04/2004, 13h41

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