Je travaille avec une interface graphique assez complexe et j'essaie de transmettre beaucoup de données de l'interface graphique à un backgroudWorker. Le problème que je rencontre est l'accès à certaines des valeurs de l'interface graphique de l'arrière-plan. Par exemple, si j'essaie d'obtenir ComboBox.Text
, je reçois un InvalidOperationException
en raison d'un croisement. Cependant, si je dis TextBox.Text
, tout semble fonctionner correctement. Certes, je suis assez nouveau à C#, donc je ne comprends pas très bien pourquoi certains d'entre eux sont OK et d'autres échouent.Comment bien transmettre les valeurs de l'interface graphique à l'arrière-plan?
J'ai trouvé plusieurs façons de résoudre mes problèmes, mais je cherche la meilleure pratique de quelqu'un qui a de l'expérience en C#.
Voici quelques façons que je peux penser de fixer ce
créer la classe/struct de toutes les valeurs que vous souhaitez passer au travailleur de fond et de transmettre quand vous appelez RunworkAsync. Je n'ai pas trouvé cela très attrayant car je devais construire une classe/struct pour chaque page sur mon interface graphique pour passer à l'arrière-plan.
Créer un tas de différents travailleurs d'arrière-plan qui avaient une tâche spécifique. J'avais encore quelques problèmes avec les données, mais la quantité de données que je devais passer a été réduite un peu. Cependant, le nombre de DoWork/ProgressChanged/RunworkerCompleted a considérablement augmenté, ce qui était loin d'être idéal.
(cela me conduit à ce que je suis en train de faire)
créer un délégué et méthode pour capturer les informations
private delegate string ReadComboDelegate(ComboBox c);
private string ReadComboBox(ComboBox c)
{
if(c.InvokeRequired)
{
ReadComboDelegate del = new ReadComboDelegate(this.ReadComboBox);
return (string) c.Invoke(del,c);
}
else
{
return c.Text
}
}
puis au sein DoWork
, faire somthing comme string txt = this.ReadComboBox(this.comboBox1);
Lorsque vous avez une interface graphique simple et que vous n'avez pas à transmettre beaucoup de données, c'est un problème assez simple. Cependant, plus le nombre d'éléments et d'éléments complexes de l'interface graphique est élevé, plus ce problème devient important. Si quelqu'un a des informations qui faciliteraient cela, je l'apprécierais.
Merci
Quelle version de .NET utilisez-vous? –
Je pense que vous êtes sur la bonne voie pour # 1 et # 2. Une unité de travail par thread et une classe personnalisée pour gérer une page sont des principes de conception décents. Est-ce que chaque page ne fait qu'une seule opération? Pouvez-vous éventuellement combiner certains contrôles? Pouvez-vous charger des informations dans les classes de paramètres de l'arrière-plan du travail au fur et à mesure qu'elles sont entrées? Si votre interface graphique est si complexe que vous ne pouvez même pas rassembler toutes les données dont vous avez besoin, il est peut-être nécessaire de revoir la conception graphique. –
Je pense que Ryan a raison. Ce code semble être une grosse boule de boue. – YWE