2009-12-17 6 views
0

Dire que j'ai la classe suivante/forme (semi-psuedo):problème travailleur de fond

public partial class X : Form 
{ 
    private DataTable dt; 
    private BackgroundWorker bg; 

    public X() 
    { 
     dt.Columns.Add("A"); 
     dt.Columns.Add("B"); 
     dt.Columns.Add("C"); 
    } 

    private void button_Click(...) 
    { 
     bg = new BackgroundWorker(); 
     bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
     bg.RunWorkerAsync(); 
    } 

    private void bg_DoWork(...) 
    { 
     // do some stuff 
     MagicMethod(parameters); 

     // doesnt work, how to fix this? 
     dataGridView1.Invoke((Action)delegate { dataGridView1.DataSource = dt; }); 
    } 

    private void MagicMethod(params) 
    { 
     // update a label, WORKS 
     label1.Invoke((Action) delegate { label1.Text = "somestuff" } 

     // do some stuff to fill the datatable 
    } 
} 

Ofcourse c'est une version distillée, sans tout BackgroundWorker est son, mais comme je veux une interface plus réactive I essayer d'en mettre un en œuvre. Mais la grille n'est pas mise à jour par le travailleur (alors que l'étiquette le fait correctement). Des conseils?

+0

Si vous pouviez fournir un exemple court mais * complet *, il serait plus facile de vous aider. –

+0

Activer le débogage> Exceptions> Exceptions Common Language Runtime> Lancer et vérifier ce qui échoue. Le code que vous avez fourni fonctionne. – jmservera

Répondre

1

Vous pouvez très bien être à l'origine d'une exception quelque part (probablement dans MagicMethod) et parce que vous ne gérez pas l'événement Bgw RunWorkerCompleted vous ne le remarquez pas.

Alors, ajoutez un événement RunWorkerCompleted et vérifiez si e.Error != null

L'événement terminé est aussi un endroit pratique et sécuritaire pour traiter les résultats: dataGridView1.DataSource = dt;

Affichez this MSDN example et faites attention à la if/else if/motif else dans l'événement RunWorkerCompleted.

+0

Je ne comprends pas, je ne reçois pas une erreur apparente dans l'événement RunWorkerCompleted: s – Oxymoron

+0

Et que diriez-vous d'un 'dataGridView1.DataSource! = Null' check in Terminé? Nous sommes en train de déboguer des enquêtes maintenant. –

+0

Lorsque je vérifie les sections locales, je trouve que le DataSource contient 52 lignes. HasErrors est défini sur false, mais toujours pas de cigare. Mon manque d'expérience avec le filetage montre vraiment ici :( J'ai posté le code dans la réponse sous ce sur – Oxymoron

Questions connexes