Laden...

Sicherstellen, dass die nächste Aktion erst ausgeführt wird, nachdem die andere beendet ist

Erstellt von Wolfi1985 vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.637 Views
Thema geschlossen
W
Wolfi1985 Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren
Sicherstellen, dass die nächste Aktion erst ausgeführt wird, nachdem die andere beendet ist

Hallo zusammen,

ich bin noch neu hier und auch noch ein Anfänger was C# betriff aber ich hoffe trotzdem das Ihr mir mit meinem Problem helfen könnt.

Bei meinem Programm soll per Buttonklick Daten aus einer MySQL-Datenbank abgefragt und in einer XML-Datei abgespeichert werden, worauf im Anschluß sich eine neue Form öffnet die diese Daten aus der XML-Datei verwendet.

Das Daten abrufen und speichern funktioniert ohne Problem aber die neue Form versucht sich zu öffnen noch bevor die XML-Datei gespeichert wurde, worauf es natürlich einen Fehler gibt.

In meinem Programm steht

Form2.Show();

erst nach den ganzen anderen Abfragen und speichergeschichten.

Nun meine Frage: Wie kann ich beeinflussen bzw. sicherstellen das die Form2 erst geöffnet wird wenn die XML-atei auch wirklich gespeichert wurde?

Vielen Dank schonmal für eure Hilfe.

J
251 Beiträge seit 2012
vor 9 Jahren

Hey,

Der Code-Schnipsel ist in der Form nicht ausreichend.
Niemand hier kennt deinen Code und hat Wissen darüber, was du in den Buttonklick genau machst bzw. wie die Speicherung der Daten von statten geht.
Man könnte mutmaßen, wo das Problem liegen könnte... Ich mutmaße somit an, dass die Speicherung der Daten in einen separaten Thread geschieht?

16.807 Beiträge seit 2008
vor 9 Jahren

Angesichts dessen, dass wir (wahrscheinlich) von Grundlagen reden bezweifle ich, dass er weiß, wie man korrekt mit Threads umgeht 😉
Un der Tatsache, dass die mySQL Abfrage eine XML erstellt und man dann diese lesen soll zeigt, dass da evtl das grundlegende Verständnis fehlt: wieso nicht gleich die mySQL Daten nutzen?! ⚠
Aber dazu reicht weder die Fehlermeldung noch die Beschreibung; da hast Du recht.

Das Daten abrufen und speichern funktioniert ohne Problem aber die neue Form versucht sich zu öffnen noch bevor die XML-Datei gespeichert wurde, worauf es natürlich einen Fehler gibt.

Sollen wir raten, wie der Fehler lautet?

Beachte [Hinweis] Wie poste ich richtig? Punkt 5

W
Wolfi1985 Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Die Fehlermeldung lautet

Fehlermeldung:
Die datei c:/.../user.xml konnte nicht gefunden werden.

Wie auch wenn sie nicht gespeichert wird bevor die neue Form aufgerufen wird.

Ich möchte die daten einmal von der Datenbank abfragen und in zwei, drei vielleicht auch vier weitern Forms verwenden aus diesem Grund Speichere ich sie in einer datei.

Wie gesagt das abspeichern und abrufen bzw. aus der Datei lesen is alles kein Problem aber die Form2 Startet bevor die datei geschrieben werden konnte. Kommentiere ich das Form2.Show(); aus erscheind die Datei genau so wie sie soll.

Seperater Thread? Nein ich glaube nicht das Passiert alles im Bereich Button_Klick.

W
955 Beiträge seit 2010
vor 9 Jahren

Hast Du die Datei korrekt geschlossen? Flush bzw. using?

16.807 Beiträge seit 2008
vor 9 Jahren

Ich möchte die daten einmal von der Datenbank abfragen und in zwei, drei vielleicht auch vier weitern Forms verwenden aus diesem Grund Speichere ich sie in einer datei.

Spricht nicht gerade für die Anwendung. Sowas macht man nicht über Dateien, sondern mit Transferobjekten: man schiebt die Daten von Form zu Form und nicht über das Dateisystem. Was passiert, wenn Du mitten drin die Datei löschst (gewollt oder ungewollt) dann hast nen Leck in Deinem Worflow.
Gewöhn Dir sowas also besser nicht an 😉

Zudem sollte die Anwendung, die unter C:\ProgramFiles liegen sollte, sowieso keine Schreibrechte auf ihren Ordner haben. Und solche Bwegungsdaten dann irgendwo abzuspeichern... nenene. Sowas macht nur Folgeprobleme.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Ich möchte die daten einmal von der Datenbank abfragen und in zwei, drei vielleicht auch vier weitern Forms verwenden aus diesem Grund Speichere ich sie in einer datei.

Da hast du aber dann einiges faslch verstanden, denn dazu benötigt man keine Dateien.

W
Wolfi1985 Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Sowas macht man nicht über Dateien, sondern mit Transferobjekten: man schiebt die Daten von Form zu Form und nicht über das Dateisystem.

Kannst du mir vielleicht erklären wie das geht bzw ein Tutorial empfehlen?

2.078 Beiträge seit 2012
vor 9 Jahren

Du erstellst eine Klasse, mit der du die Daten in ein Objekte bringen kannst und gibst dieses Objekt dem zweiten Fenster. Das zweite Fenster hat dann die Daten schneller als das Speichern überhaupt anfangen konnte.

Abgesehen davon kann die Methode nur weiter laufen, wenn der vorherige Vorgang entweder fertig ist oder in einem anderen Thread liegt.
Letzteres wäre überflüssig, da du dann ja sowieso darauf warten musst.

So oder so, wie die Vorredner schon sagten: Ohne deinen Code, der speichert, können wir nicht helfen.

16.807 Beiträge seit 2008
vor 9 Jahren

Abgesehen davon kann die Methode nur weiter laufen, wenn der vorherige Vorgang entweder fertig ist oder in einem anderen Thread liegt.
Letzteres wäre überflüssig, da du dann ja sowieso darauf warten musst.

..aber notwendig wenn die Gesamtaktion länger als 1/10s dauert, da ansonsten die GUI hängt.

Siehe [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) auch bzw. für die Datenübergabe [FAQ] Kommunikation von 2 Forms

W
Wolfi1985 Themenstarter:in
4 Beiträge seit 2014
vor 9 Jahren

Puh kling für mich jetzt erstmal nach Bahnhof aber ich werde mich mal daran versuchen und zur Not gibts ja da noch so ein Buch wo auch einiges drin steht.

Vielen Dank für eure Hilfe.

J
251 Beiträge seit 2012
vor 9 Jahren

Die Fehlermeldung lautet

Fehlermeldung:
Die datei c:/.../user.xml konnte nicht gefunden werden.

Ich könnte mir vorstellen, dass es in der Speicher-Methode ein böses Try/Catch gibt, welches einen Fehler schluckt...
Der Fehler wäre unter den Aspekt interessant für den Umgang mit Daten und deren Speicherung in ein XML (also zum selbständiges Lernen).

T
415 Beiträge seit 2007
vor 9 Jahren

Zeig doch einfach mal ein bisschen Code und poste die relevanten Code-Stellen. Dort wo die Datei geschrieben wird und den Ablauf zum Aufruf deiner Form.

2.078 Beiträge seit 2012
vor 9 Jahren

@Abt:

Stimmt, dann ist ein extra Thread bzw. der Backgroundworker ganz praktisch.
Aber sollte das der Fall sein, dann muss er wahrscheinlich sein Vorgehen groß ändern und kann nicht darauf warten.

Was Jamikus schreibt, bestätigt nochmal: Ohne den Code wird das hier nix

16.807 Beiträge seit 2008
vor 9 Jahren

Ich seh das anders: ich brauch den Code nicht um zu erkennen, dass das Arbeiten über Dateien - sorry - einfach Quatsch ist.
Er soll die Grundlagen inhalieren und sauber mit der Form-Kommunikation von Daten arbeiten. Dann klappt's auch mit dem Nachbarn 😉

49.485 Beiträge seit 2005
vor 9 Jahren

Hallo zusammen,

so ist der Thread jedenfalls nur Rätselraten und könnte noch ewig weitergehen, ohne dass er jemanden nützt. Alles wesentliche ist eh schon gesagt. Und Wolfi1985 hat bereits eingesehen, dass er sich sinnvollerweise die Grundlagen erstmal aus einem Buch aneignen muss. Hilfe dabei gibt es in [FAQ] Wie finde ich den Einstieg in C#?.

Im übrigen gilt [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

Thema geschlossen