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 :

Attendre la fin d'un événement avec fermeture de l'application


Sujet :

Silverlight

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut Attendre la fin d'un événement avec fermeture de l'application
    Bonjour à tous

    Je travaille avec Silverlight 3 dans IE ou Firefox. Mon application est pourvue d'un bouton "Déconnexion" qui, lorsqu'on appuie dessus, va insérer une ligne de log en base de données.

    Seulement, les utilisateurs ont le droit de fermer le navigateur avec la croix, et je veux que ça insère de la même façon la ligne en base de données. Le problème, c'est que quand l'utilisateur ferme le navigateur, la ligne n'a pas le temps d'être insérée en base. J'ai donc testé plusieurs choses, sans succès.

    Voici mon code actuel :
    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
    29
    30
    public MainPage()
    {
      InitializeComponent();
      Application.Current.Exit += new EventHandler(Current_Exit);
    }
    
    private void Current_Exit(object sender, EventArgs e)
    {
      InsereLigne();
      Thread threadSleep = new Thread(WaitForDisconnection);
      threadSleep.Start();
    }
    
    private void WaitForDisconnection()
    {
      while (!ucLogin.IsDisconnected) // boolean qui m'indique quand l'insère est terminé
      {
    	// test 1
    	int j = 0;
    
    	for (int i = 0; i < 10000; i++)
    	{
    	  j++;
    	  j--;
    	}
    	
    	// test 2
    	System.Threading.Thread.Sleep(10000);
      }
    }
    Le résultat :
    - test 1 : semble tourner en boucle indéfiniment quand on débug, et ferme direct le navigateur quand on arrête le debug
    - test 2 : ferme direct le navigateur quand on passe sur le Sleep()

    Merci de votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 032
    Points : 5 472
    Points
    5 472
    Par défaut
    Je pense que si c'est possible, il faudrait voir du coté de javascript.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2003
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juillet 2003
    Messages : 50
    Points : 68
    Points
    68
    Par défaut
    Bonjour,

    Avec SL, il n'y pas moyen d’appeler un WebService lors de la fermeture de l'application.
    J'ai rencontré ce problème il y a quelque de temps de ça, et le technique que j'ai utilisé et de sauver dans l'isolate storage de l'application les données que je voulais transmettre et lors du prochain lancement de l'application on fait appel au WebService avec les données trouver dans l'isolate storage.

    A+,
    MasterSleepy.

  4. #4
    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
    Il me semble qu'en appelant une MessageBox (coté javascript je crois) cela laisses du temps supplémentaires à l'evenement de fermeture mais bon...

    Sinon, si tu utilises des sessions coté serveur, cela peut être une bonne idée d'envoyer ton WebService lors de l'evenement de fin session.

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Merci pour vos réponses.

    Concernant l'isolate storage, apparemment c'est comme des cookies. Le problème c'est que si l'utilisateur se réconnecte depuis un autre ordi, il perd l'isolate storage.

    La MessageBox ça ne semble pas fonctionner. J'ai l'impression que le thread est 100% occupé par la MessageBox.

    Sinon, avant de regarder côté javascript (j'aime pas le javascript ), tu peux m'expliquer en quelques mots ta proposition de Webservice Samuel stp ? J'ai regardé sur le net, ça part un peu dans tous les sens. Donc qu'est-ce que t'entends par là ?

    Merci d'avance !

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2007
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 677
    Points : 2 137
    Points
    2 137
    Par défaut
    Tu peux paramétrer le behavior de ton WCF de façon à ce que ta session se ferme toute seule en cas d’inactivité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     [ServiceBehavior(
         InstanceContextMode = InstanceContextMode.PerSession,
         AutomaticSessionShutdown = true)]

    Tu t’abonnes ensuite à l’événement "closing" de ton service et le tour est joué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    void Channel_Closing(object sender, EventArgs e)
    { Logout(); }

  7. #7
    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
    Pour la fermeture de session, cela peut se passer sur la fermeture d'une session WCF comme le préconise I_Pnose ou la fermeture d'une session ASP.NET.

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    111
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 111
    Points : 44
    Points
    44
    Par défaut
    Toujours concernant mon problème d'insertion d'une ligne de log en base de données à la fermeture du navigateur, j'ai testé une autre solution : à la fermeture, j'appelle une méthode de webservice SendEmail(), qui est d'ailleurs présentée en tant que SendEmailAsync() dans le client Silverlight. Mais ça ne fonctionne pas.
    => Est-ce normal ?

    Sinon, vous proposez de travailler avec les sessions. Or, sauf erreur de ma part, je n'ai pas de session dans mon projet. Dois-je instaurer les sessions pour pouvoir tester vos propositions ?

    Merci d'avance

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2011
    Messages : 82
    Points : 107
    Points
    107
    Par défaut
    Bonjour,

    Tu utilise obligatoirement une session si tu te connecte a ton WCF (c'est cette connexion qu'on appelle session).
    Ton instance webService cote client est gere au travers de session (ContextParSession ou ContextParRequete) ce que tu peux regle pour affiner la charge du WCF mais c'est pas le sujet.

    Tes appels de methode cote client sont toujours asynchrone (Silverlight oblige).

    Un invoke du webClient ne passe pas a la fermeture ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/05/2015, 10h52
  2. [MooTools] mootools attendre la fin d'un évènement
    Par damien77 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 30/07/2010, 10h15
  3. Attendre la fin de l'impression avec "ShellWait"
    Par Scuba69 dans le forum VBA Access
    Réponses: 1
    Dernier message: 03/06/2007, 11h23
  4. Attendre la fin du chargement de la page dans un WebBrowser
    Par core1 dans le forum Web & réseau
    Réponses: 5
    Dernier message: 15/06/2003, 05h12
  5. Comment Attendre la fin d'un Processus
    Par mr_titi dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/06/2003, 17h35

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