2011-08-13 2 views
0

Ma requête concerne environ BackgroundWorker.Utilisation de l'arrière-plan dans une application multithread

J'ai une application Windows Forms qui démarre 10 nouveaux threads. Chaque thread recevra des informations de 10 services Web différents. Tout ce dont j'ai besoin est d'ajouter le résultat d'un appel de service web dans une boîte de texte riche placée en mode design. Comment puis-je utiliser le thread d'arrière-plan dans ce scénario?

ArrayList threadList; 

for (int idx = 0; idx < 10; ++idx) 
{ 
    Thread newth= new Thread(new ParameterizedThreadStart(CallWS)); 
    threadList.Add(newth);  
} 


for (int idx = 0; idx < 10; ++idx) 
{ 
    Thread newth= new Thread(new ParameterizedThreadStart(CallWS)); 
    newth.Start(something);   
} 


for (int idx = 0; idx < 10; ++idx) 
{ 
    //Cast form arraylist and join all threads. 
} 

private void CallWS(object param) 
{ 
    // Calling WS 
    // got the response. 
    // what should I do to append this to rich text box using background worker. 
} 

Toute aide très appréciée.

+2

Nous sommes en 2011. Pourquoi utilisez-vous 'ArrayList' au lieu de' List '? En outre, votre code n'a pas de sens. Pourquoi créez-vous 10 threads, puis commencez 10 threads complètement différents? – svick

+0

Le code n'utilise pas le composant BackgroungWorker et le thread n'a pas de sens. –

Répondre

1

Worker Threads vous pouvez mettre à jour richtextbox de manière suivante:

private void CallWS(object param) 
{ 
    string updatedText = .. 

    // build a text  

    this.Invoke((MethodInvoker)delegate { 
     // will be executed on UI thread 
     richTextBox.Text = updatedText; 
    }); 
} 
+0

Merci, mais le programme se bloque sur cette ligne – Gonsal

+0

Je l'ai essayé avant aussi. Le formulaire devient irresponsable. Pendant le débogage, je ne vois pas où va le contrôle après l'exécution de cette ligne. – Gonsal

+0

vérifier cela: [http://stackoverflow.com/questions/142003/cross-thread-operation-not-valid-control-accessed-from-a-thread-other-than-the-t/142069#142069] – saber

1

Je ne suis pas sûr que l'utilisation BackgroundWorker est la meilleure solution dans votre cas. Cependant, si vous utilisez backgroundWorker, vous pouvez utiliser le même événement RunWorkerCompleted (qui est exécuté sur le thread principal) pour tous les BackgroundWorkers. Vous pouvez donc mettre à jour votre interface utilisateur pour cet événement.

Si vous cherchez un exemple pour backgroundWorker, regardez here.

1

Je ne comprends pas vraiment le contexte, mais je crois que ce qui suit:

  1. Vous travaillez avec Windows.Forms
  2. Vous avez plusieurs threads
  3. Chaque thread veut exécuter du code (ajout d' texte) dans le fil de l'interface utilisateur

La solution n'utilise donc pas BackgroundWorker. Au lieu de cela, vous devez utiliser BeginInvoke: http://msdn.microsoft.com/en-us/library/system.windows.forms.richtextbox.begininvoke.aspx

RichTextBox.BeginInvoke Méthode

un délégué Exécute de manière asynchrone sur le thread qui poignée sous-jacente du contrôle a été créé.

Votre problème, comme Hans Passant a commenté sllev's answer, pourrait être vous bloquer le thread d'interface utilisateur pour une raison quelconque, en utilisant Invoke.

Essayez de remplacer Invoke par BeginInvoke.

Questions connexes