Laden...

Control 'comboBox2' accessed from a thread other than the thread it was created on.

Erstellt von Neokil vor 11 Jahren Letzter Beitrag vor 11 Jahren 512 Views
Thema geschlossen
Neokil Themenstarter:in
206 Beiträge seit 2008
vor 11 Jahren
Control 'comboBox2' accessed from a thread other than the thread it was created on.

Hallo,

ich habe ein Analyseprogramm geschrieben, das jetzt so weit funktioniert. Allerdings möchte ich jetzt die Analysefunktion in einen weiteren Thread auslagern, damit die Form bei größeren Datenmengen nicht einfriert.
Jetzt sieht die Funktion aber so aus, dass ich ihr ca. 10 Werte übergeben muss.


public void AnalyseUndReportErstellenVodafone(string _monatsId1, string _monatsId2, string _monatsId3, string _excelVorlage, string _ppVorlage, string _letzterMonat, string _SaveExcelFilename, string _SavePPFilename, string _SavePDFFilename, string _firmenname)

Ein bisschen Google-Suche hat mich auf folgenden Ansatz gebracht (Why Does ParameterizedThreadStart Only Allow Object Parameter?):


AuREVodafone = new Thread(() => { AnalyseUndReportErstellen(((ListBoxItem)comboBox2.SelectedItem).ctv, ((ListBoxItem)comboBox3.SelectedItem).ctv, ((ListBoxItem)comboBox4.SelectedItem).ctv, ExcelVorlage, PPVorlage, ((ListBoxItem)comboBox5.SelectedItem).monat, Speicherort1, Speicherort2, Speicherort3, _dataset1.besitzer); });

Dieser bricht allerdings mit folgender Fehlermeldung ab:> Fehlermeldung:

Cross-thread operation not valid: Control 'comboBox2' accessed from a thread other than the thread it was created on.

(Abbruch kommt mit der Initialisierung, ohne dass der Thread ausgeführt wird)
Was mich so sehr daran wundert ist der Fakt, dass ja noch gar kein neuer Thread ausgeführt wird und trotzdem eine "Cross-Thread"-Exception kommt.

Das Einzige, was mir dazu einfallen würde, wäre über Invoke zu gehen, wobei mich wieder der Fakt stört, dass ja gar nicht aus einem neuen Thread zugegriffen wird...
Hat jemand eine Idee zur Fehlerlösung oder gibt es einen komplett anderen, besseren/eleganteren Weg das Ganze zu bewerkstelligen?

Gruß
Neokil

16.842 Beiträge seit 2008
vor 11 Jahren

Das ist absolut klar und gehört zu den Grundlagen, die wir als bekannt voraussetzen [Hinweis] Wie poste ich richtig? - daher ist hier auch zu. Trotzdem als Erklärung:

Und doch: Du erstellst einen neuen Thread - UND Du greifst aus diesem auf die Eigenschaften eines UI-Objekts zu, und das geht nur aus dem Thread, in dem auch die UI läuft - ergo der MainThread.
Es darf niemals ein UI-Objekt oder ein von dem abstammendes Element, wie das ListBoxItem an einen anderen Thread übergeben oder von diesem erstellt oder gar manipuliert werden.

Machs sauber, so wie es auch überall steht: Kapsel Deine UI von der Business-Logik ab.

Thema geschlossen