2016-09-17 1 views
0

Je souhaite traiter des données dans un thread et, en même temps, conserver le contrôle sur l'interface utilisateur. Dans mon programme, lorsque je clique sur un bouton "Connect", le client est connecté à un serveur via une socket, mais en même temps je voudrais démarrer un thread qui attend en permanence un message du serveur. Mon code est approxymately:Multithreading dans l'application WPF

Thread ListenThread; 
SocketClient socket = new SocketClient(); 

     public MainWindow() 
     { 
      ListenThread = new Thread(Wait); 
      InitializeComponent(); 
      socket.StartClient(PORT); 
     } 

private void CONNECT_Click(object sender, RoutedEventArgs e) 
     { 
      socket.Connect(); 
      UpdateUI(); 
      ListenThread.Start(); 
     } 

private void Wait(){ 
      while (socket.isConnected()) 
       socket.WaitForSomething(); 
     } 

private void TextBox_KeyDown(object sender, KeyEventArgs e) 
     { 
      HandlePressure(e.Key); 
     } 

Le problème est que, quand je commence ListenThread, je ne peux pas utiliser l'interface utilisateur (j'ai une zone de texte qui recueille des commandes que je dois envoyer au serveur). Comment puis-je gérer cette situation? Merci.

Répondre

-2

Avez-vous envisagé d'utiliser le mécanisme async/await avec la classe Task au lieu des threads réguliers?

Référence: https://msdn.microsoft.com/en-us/library/mt674882.aspx

+0

Ceci n'est pas une réponse. Vous devez obtenir vos 50 points de repêchage et poster ceci comme commentaire. Vous devriez supprimer ceci. – Enigmativity

2

Vous pouvez utiliser cette discussion.
Rappelez-vous que si vous voulez appeler la méthode ou de tout contrôle de fenêtre, vous devez utiliser

Dispatcher.Invoke(new Action(()=> 
{ 
//Call method or controls of window here 
})); 
+0

J'utilise déjà la classe 'Thread'. La fonction «Wait» ne contrôle pas directement l'interface utilisateur et je ne peux pas utiliser l'interface utilisateur. – jonyballerino

+0

Désolé, vous pouvez me montrer le code complet de ce fichier? –

+0

maintenant ça marche, je ne sais pas où était l'erreur. Merci beaucoup. – jonyballerino

0

Vous devez recueillir toutes les informations dont vous avez besoin pour ListenThread avant d'appeler, puis passez à ListenThread.Start (param1, param2 ...) ou ListenThread.Start (objectWithParameters). De cette façon, vous obtenez des données sur le thread d'interface utilisateur, qui a accès à tous les contrôles de l'interface utilisateur et non à partir d'un autre thread qui n'a pas accès au thread de l'interface utilisateur.

Lorsque vous avez terminé le calcul sur le thread de travail (ListenThread), vous pouvez mettre à jour les contrôles de l'interface utilisateur par la méthode Dispatcher.Invoke. L'appel des délégués Dispatcher appelle le thread de l'interface utilisateur, où vous pouvez avoir un accès complet à tous les contrôles.

+0

Dans la fonction appelée par 'ListenThread' (' Wait') j'ai besoin d'informations que j'ai déjà ('socket' dans ce cas). Je ne suis pas sûr de comprendre ce que vous dites. – jonyballerino