Ich arbeite mit einer ziemlich komplexen GUI und versuche, eine Menge Daten von der GUI an einen BackgroudWorker zu übergeben. Das Problem, auf das ich stoße, ist der Zugriff auf einige der GUI-Werte aus dem Background Worker. Zum Beispiel, wenn ich versuche ComboBox.Text
Ich bekomme eine InvalidOperationException
aufgrund von Überschneidungen. Wenn ich jedoch sage do TextBox.Text
scheint alles gut zu funktionieren. Zugegeben, ich bin ziemlich neu in C#, so bin ich ein wenig unklar, warum einige von diesen sind OK und andere nicht.
Ich habe mit mehreren Möglichkeiten kommen, um meine Probleme zu beheben, aber bin auf der Suche nach der besten Praxis von jemandem, der in c# erfahren ist.
Hier sind ein paar Möglichkeiten, die ich mir vorstellen kann, um dies zu beheben
-
Erstellen Sie eine Klasse/Struktur mit allen Werten, die Sie an den Hintergrund-Worker übergeben möchten, und übergeben Sie diese, wenn Sie RunworkAsync aufrufen. Ich fand dies nicht sehr attraktiv, da ich für jede Seite auf meiner GUI eine Klasse/Struktur erstellen musste, um sie an den BackgroundWorker zu übergeben
-
Erstellen Sie eine Reihe von verschiedenen Hintergrundarbeitern, die bestimmte Aufgaben haben. Ich hatte immer noch einige Probleme mit der Übergabe von Daten, aber die Menge der Daten, die ich übergeben musste, wurde ziemlich viel reduziert. Allerdings ging die Anzahl der DoWork/ProgressChanged/RunworkerCompleted erheblich, die weniger als ideal war.
-
(dies führte mich zu dem, was ich derzeit tue)
einen Delegaten und eine Methode zur Erfassung der Informationen erstellen
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
}
}
dann innerhalb DoWork
tun Sie etwas wie string txt = this.ReadComboBox(this.comboBox1);
Wenn Sie eine einfache grafische Benutzeroberfläche haben und nicht viele Daten übergeben müssen, ist dies ein ziemlich einfaches Problem. Je mehr Elemente und je komplexer die grafische Benutzeroberfläche wird, desto größer wird dieses Problem jedoch. Wenn jemand irgendwelche Informationen hat, die dies einfacher machen, wäre ich dankbar.
Danke