2010-03-08 5 views
5

Scénario:C# Aide avec un exemple pédagogique de base d'un processus BackgroundWorker peuplant DataGridView

J'ai une forme de fenêtres qui est titulaire d'un DataGridWiew avec 3 colonnes prédéfinies. J'ai 3 variables déclarées en dehors de la fonction et affectées à l'intérieur de la fonction. J'ai une fonction qui énumère des choses et il met dans les 3 colonnes, ligne par ligne:

string VARIABLE1; 
string VARIABLE2; 
string VARIABLE3; 

private void FunctionEnumerateStuff() 
{ 
    foreach (StuffObject STUFF in StuffCollection) 
    { 
     VARIABLE1 = STUFF.SubStuff1.ToString(); 
     VARIABLE2 = STUFF.SubStuff2.ToString(); 
     VARIABLE3 = STUFF.SubStuff3.ToString(); 
     DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3); 
    } 
} 

Ce que je veux faire, est d'exécuter cette fonction d'un processus BackGroundWorker, de sorte que l'interface graphique de l'application sera lisse et réactif. J'ai lu sur les travailleurs de l'arrière-plan, mais j'ai de la difficulté à communiquer, parce que tous les exemples semblent être des scénarios entièrement différents et la plupart d'entre eux sont extrêmement complexes. Une âme pédagogique utile peut-elle m'aider, ainsi que d'autres, à donner un exemple très simple de la façon la plus simple de faire fonctionner le système? Merci.

+0

Quelle est la chose qui prend tant de temps? Pourquoi le rendre asynchrone? Avez-vous des dizaines de milliers de lignes? Avez-vous des problèmes maintenant avec le clapot dans l'interface utilisateur? Peut-être pourriez-vous montrer votre code actuel, si c'est le cas. Le code que vous montrez ici ne sera pas compilé. – Cheeso

+3

J'ai choisi de ne pas être précis sur le code et pourquoi je veux utiliser une solution avec un arrière-plan. J'ai choisi un "faux code" juste pour illustrer le problème et j'espère obtenir une réponse pédagogique, et non une solution de contournement. J'ai choisi de formuler ma question de cette façon parce que je veux vraiment apprendre par un exemple de base, ne pas avoir quelqu'un d'autre à écrire la solution dans le code pour moi. J'ai choisi cet exemple non spécifique, de sorte que, espérons-le, beaucoup d'autres qui semblent être aux prises avec une telle confusion peuvent aussi en tirer des leçons et en tirer des leçons. – Roger

+1

Vous nous confondez avec vos mots étranges! Pédagogique: de, se rapportant à, ou convenant à un enseignant ou une éducation :) – VoidDweller

Répondre

1

J'utiliser quelque chose comme ça (très peu précis et non testé):

private void bgw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     var list = new List<SomeRowType>(); 

     foreach (StuffObject STUFF in StuffCollection) 
     { 
      VARIABLE1 = STUFF.SubStuff1.ToString(); 
      VARIABLE2 = STUFF.SubStuff2.ToString(); 
      VARIABLE3 = STUFF.SubStuff3.ToString(); 
      //DatagridWiew1.Rows.Add(VALUE1, VALUE2, VALUE3); 
      list.Add(new SomeRowType(VALUE1, VALUE2, VALUE3)); //probably meant: VARIABLEn 
     } 
     e.Result = list; 
    } 

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
     } 
     else 
     { 
      var list = (List<SomeRowType>)e.Result; 
      DatagridWiew1.DataSource = list; 
     } 
    } 
+0

Merci Henk! Je vais essayer votre exemple demain. En retard pour le codage en ce moment :) – Roger

1

Voici un exemple:

class Form1 : Form 
{ 
    private BackgroundWorker Worker { get; set; } 

    public Form1() 
    { 
     Worker = new BackgroundWorker(); 
     Worker.WorkerSupportsCancellation = true; 
     Worker.DoWork += OnWorkerDoWork; 
     Worker.RunWorkerCompleted += OnWorkerRunWorkerCompleted; 

     // at some point start the worker. 
     Worker.RunWorkerAsync(); 
    } 

    void OnWorkerDoWork(object sender, RunWorkerCompletedEventArgs e) 
    { 
     foreach(var data in someData) 
     { 
      // if cancelled 
      if (e.Cancelled) 
       return; 

      AddDataToColumn(someData.Var1, someData, Var2, someData.Var3); 
     } 
    } 

    void OnWorkerRunWorkerCompleted(object sender, DoWorkEventArgs e) 
    { 

    } 

    private delegate void AddDataToColumnDelegate(string var1, string var2, string var3); 
    private void AddDataToColumn(string var1, string var2, string var3) 
    { 
     // check if cross-thread operation 
     if (InvokeRequired) 
     { 
      Invoke(new AddDataToColumnDelegate(AddDataToColumn), var1, var2, var3); 
      return; 
     } 

     // Add data to column 
     dataGridView1.Rows.Add(var1, var2, var3); 
    } 
}