Servus miteinander!
Als ich gestern in diesem Beitrag: kann CheckForIllegalCrossThreadCalls Probleme verursachen? hier großspurig vom Umstellen eines meiner Projekte, auf ein anderes (Code-)Design, bin ich grad der Ernüchterung erlegen: So wie ich das vorhatte funzt es einfach ned
Im Prinzip handelt es sich dabei um 2 Klassen: Eine Form-Klasse, die über Fabrik-Klassen seine Controls erstellt und um eine reine Logik-Klasse, die Datenbabkanfragen macht, und dann die Daten in das UI schreibt. Dass das an sich ein Codetechnischer Mist ist, braucht mir hier bitte keiner erzählen - hab das a) in einer Woche geschrieben und b) war's egal wie, Hauptsache es lief).
Grob der genauere Ablauf: Die Form-Klasse(Form1) hat im Konstruktor seine Controls auf sich erstellt und im Form-Load Event wurde in einer Endlosschleife und await ein Task gestartet, der eine statische Methode aus einer anderen Klasse aufgerufen hat, die andere Klasse hat darauf hin eine Datenbank abgefragt und das Resultat anschließend per Referenz auf die Form in die publiken Attributen(waren Dictionary aus String als Key (Name des Controls) und Control als Value) geschrieben.
Was ich im letzen Satz erkläre, wurde per Control.Invoke(Action()) gemacht.
Ich hab mich also mal hingesetzt und wollte das ganze besser lösen. In der Verbesserung sollte das ganze ermöglicht werden, indem ich in der Datenbankabfrage-Klasse(QueryDatabase), sobald ich mir den Abfragen durch bin, ein Event auslösen(QueryComplete), welches als EventArgs-Attribut(QueryDatabaseEventArgs) ein Dictionary<string, int> haben. Hierbei ist der string als Key der Name des Controls und int der Wert, der auf dem Controls als Text stehen soll (Controls sind eigentlich nur Labels).
Doof nur, dass ich eine besagte
Was ich im Verdacht hatte, war, dass es evtl daran lag, dass ich mir die Werte von einem Event hole, das von einer Klasse ausgelöst wurde, von der eine Methode in einem anderen Thread aufgerufen wurde, deswegen habe ich mir dann beide Projekte (einmal Event-basiert und einmal als reiner Methodenaufruf) zusätzlich als "mit Men in the Middle", sprich einer Interface-Klasse/Stellvertreter-Klasse gebaut(QueryDatabaseInterface). Dabei hat die Form1-Klasse keinerlei Zugriff auf die QueryDatabase-Klasse (und anderes herum natürlich auch ned ;D).
Form1 ruft im Load-Event auf QueryDatabaseInterface eine Run()-Methode auf. Diese ruft wiederum auf der QueryDatabase-Klasse, von der QueryDatabase eine Referenz hat, eine Methode auf, die das Query durchführt. Nach Beendigung des Query wird ein Event(QueryComplete) ausgelöst, für das es in QueryDatabaseInterface einen entsprechenden Handler gibt. In dem Handler wiederum wird über eine Referenz, die QueryDatabaseInterface auf Form1 hat, eine UpdateUI-Methode aufgerufen, welche als Parameter ein Dictionary<string, int> enthält, um damit dann die UI-Elemente zu betexten.
Nur leider habe ich hier genau das selbe Problem mit dem angeblichen Threadübergreifenden Zugriff.
Ich würde euch bitte, euch das ganze mal anzusehen und evlt kann mir ja wer dabei helfen ;D
Lg Radinator
PS: Ich hänge mal alle vier Projekte an.
Als ich gestern in diesem Beitrag: kann CheckForIllegalCrossThreadCalls Probleme verursachen? hier großspurig vom Umstellen eines meiner Projekte, auf ein anderes (Code-)Design, bin ich grad der Ernüchterung erlegen: So wie ich das vorhatte funzt es einfach ned
Im Prinzip handelt es sich dabei um 2 Klassen: Eine Form-Klasse, die über Fabrik-Klassen seine Controls erstellt und um eine reine Logik-Klasse, die Datenbabkanfragen macht, und dann die Daten in das UI schreibt. Dass das an sich ein Codetechnischer Mist ist, braucht mir hier bitte keiner erzählen - hab das a) in einer Woche geschrieben und b) war's egal wie, Hauptsache es lief).
Grob der genauere Ablauf: Die Form-Klasse(Form1) hat im Konstruktor seine Controls auf sich erstellt und im Form-Load Event wurde in einer Endlosschleife und await ein Task gestartet, der eine statische Methode aus einer anderen Klasse aufgerufen hat, die andere Klasse hat darauf hin eine Datenbank abgefragt und das Resultat anschließend per Referenz auf die Form in die publiken Attributen(waren Dictionary aus String als Key (Name des Controls) und Control als Value) geschrieben.
Was ich im letzen Satz erkläre, wurde per Control.Invoke(Action()) gemacht.
Ich hab mich also mal hingesetzt und wollte das ganze besser lösen. In der Verbesserung sollte das ganze ermöglicht werden, indem ich in der Datenbankabfrage-Klasse(QueryDatabase), sobald ich mir den Abfragen durch bin, ein Event auslösen(QueryComplete), welches als EventArgs-Attribut(QueryDatabaseEventArgs) ein Dictionary<string, int> haben. Hierbei ist der string als Key der Name des Controls und int der Wert, der auf dem Controls als Text stehen soll (Controls sind eigentlich nur Labels).
Doof nur, dass ich eine besagte
InvalidOperationException
bekomme, sobald ich den Text der Controls setzen will (oder vielmehr, sobald ich ihn mit einem Wert aus dem Data-Attribut meines EventArgs belege). Muss dazu sagen, ich hab das ganze sowohl Event-basiert, als auch mit Referenzen und Aufruf von publiken Methoden gelöst (bzw versucht) => beide male das selbe ErgebnisWas ich im Verdacht hatte, war, dass es evtl daran lag, dass ich mir die Werte von einem Event hole, das von einer Klasse ausgelöst wurde, von der eine Methode in einem anderen Thread aufgerufen wurde, deswegen habe ich mir dann beide Projekte (einmal Event-basiert und einmal als reiner Methodenaufruf) zusätzlich als "mit Men in the Middle", sprich einer Interface-Klasse/Stellvertreter-Klasse gebaut(QueryDatabaseInterface). Dabei hat die Form1-Klasse keinerlei Zugriff auf die QueryDatabase-Klasse (und anderes herum natürlich auch ned ;D).
Form1 ruft im Load-Event auf QueryDatabaseInterface eine Run()-Methode auf. Diese ruft wiederum auf der QueryDatabase-Klasse, von der QueryDatabase eine Referenz hat, eine Methode auf, die das Query durchführt. Nach Beendigung des Query wird ein Event(QueryComplete) ausgelöst, für das es in QueryDatabaseInterface einen entsprechenden Handler gibt. In dem Handler wiederum wird über eine Referenz, die QueryDatabaseInterface auf Form1 hat, eine UpdateUI-Methode aufgerufen, welche als Parameter ein Dictionary<string, int> enthält, um damit dann die UI-Elemente zu betexten.
Nur leider habe ich hier genau das selbe Problem mit dem angeblichen Threadübergreifenden Zugriff.
Ich würde euch bitte, euch das ganze mal anzusehen und evlt kann mir ja wer dabei helfen ;D
Lg Radinator
PS: Ich hänge mal alle vier Projekte an.
In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell