2010-11-10 13 views
2

J'ai besoin dans wpf app vérifier les messages sur le serveur. J'ai propre méthode qui charge des messages sur le serveur LoadRp ().WPF, méthode de serveur appelant en arrière-plan travailleur

Je voudrais créer une sorte d'auditeur qui vérifie, toutes les 3 secondes si sur le serveur ne sont pas de nouveaux messages.

J'appelle la méthode pour charger des messages sur l'événement de ticker de répartiteur, est-ce approprié? Toute autre solution. Il est possible d'appeler le temporisateur dans un autre thread dans wpf?

code

est ici:

public MessangerWindow(PokecCommands pokecCmd) 
    { 
     InitializeComponent(); 

     PokecCmd = pokecCmd; 

     _friendsData = PokecCmd.LoadFriends(); 
     friendsListBox.DataContext = _friendsData; 

     _dispatcherTimer = new DispatcherTimer(); 
     _dispatcherTimer.Tick+=new EventHandler(DispatcherTimer_Tick); 
     _dispatcherTimer.Interval = new TimeSpan(0,0,3); 
     _dispatcherTimer.Start(); 
    } 

    private void DispatcherTimer_Tick(object sender, EventArgs eventArgs) 
    { 
     try 
     { 

      //try load new message from sever 
      RP message = PokecCmd.LoadRp(); 

      //arived message 
      if (message != null) 
      { 
       //exist window 
       if (_chatWindows.ContainsKey(message.Nick)) 
       { 
        _chatWindows[message.Nick].Show(); 
       } 
       { 
        //create new Window 
        var chatWindow = new ChatWindow(PokecCmd, message); 
        _chatWindows.Add(message.Nick, chatWindow); 
        chatWindow.Show(); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      //MessageBox.Show(ex.Message); 
     } 
    } 

Ce qui convient à utiliser:

  • Dispatcher sans fils de fond
  • Dispatcher avec des fils de fond
  • plusieurs threads

Répondre

1

Si y Vous pouvez bloquer votre interface utilisateur le temps qu'il faut pour vérifier sur le serveur, en utilisant un DispatcherTimer comme vous le faites fonctionnera correctement.

Si la vérification des nouveaux messages peut prendre plus de quelques millisecondes et que vous souhaitez que votre interface utilisateur soit réactive pendant la vérification, vous devez utiliser plusieurs threads. Dans ce cas, une fois les nouvelles données arrivées, vous utiliserez Dispatcher.Invoke pour l'afficher.

Votre code dans le thread qui vérifie les messages pourrait ressembler à ceci:

//try load new message from sever 
RP message = PokecCmd.LoadRp(); 

//arived message 
if(message != null) 
    Dispatcher.Invoke(DispatcherPriority.Send, new Action(() => 
     { 
      //exist window 
      if (_chatWindows.ContainsKey(message.Nick)) 
      { 
       _chatWindows[message.Nick].Show(); 
      } 
      { 
       //create new Window 
       var chatWindow = new ChatWindow(PokecCmd, message); 
       _chatWindows.Add(message.Nick, chatWindow); 
       chatWindow.Show(); 
      } 
     } 
); 
+0

Nous vous remercions d'avance. –

+0

De rien. Est-ce que vous allez marquer ma réponse comme correcte? –