Autor |
Beitrag |
mrtfr
Beiträge: 26
|
Verfasst: Mo 28.01.19 15:10
Hi,
ich habe ein Programm erstellt, welches unter anderem das Tagesessen in unserer Kantine anzeigen soll. Das lief auch alles super, bis zum deploy.
Am Anfang ist alles gut.. Die Daten werden abgefragt und angezeigt. Doch irgendwann kommt die Meldung, dass die Datei nicht gefunden wurde.. Und das ist äußerst doof.
Ich hoffe auf eure Hilfe! Ich bin auch gerne offen für workarounds..
Meine aktuelle Idee: (If-else-Abfrage, ob das lesen möglich ist, wenn nicht, denn Ticker neu starten..)
Grüßle Moderiert von Christian S.: Topic aus WinForms verschoben am Di 29.01.2019 um 10:32
Einloggen, um Attachments anzusehen!
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Mo 28.01.19 15:40
Gibt es denn Situationen, wo die Datei nicht existiert?
Wird sie z.B. Mal gelöscht und danach mit neuen Daten erstellt?
Ich sehe drei Möglichkeiten:
1. Dein Vorschlag
2. Du verwendest eine zentrale Server-Anwendung, die liest/schreibt und die Clients fragen nur noch dort nach den Daten. Dadurch hast Du die Möglichkeiten, die Zugriffe aufeinander abzustimmen und wenn sich Schreib- und Lese-Zugriffe in die Quere kommen, muss ein Client warten, bis der Andere fertig ist.
3. Du verwendest einen Datenbank-Server, der kann das alles ganz alleine, allerdings kannst Du dann nicht mehr im eigenen Code manipulieren, wie die Zugfriffe aufeinander abgestimmt werden.
Ich persönlich würde zu Option 2 tendieren, mit WCF ist das ganz schnell gemacht - braucht allesdrings einen Server, wo das Programm läuft.
Ich würde mir aber auch Mal überlegen, ob wirklich alle 3,75 Sekunden darauf zugegriffen werden muss. Reicht da nicht auch alle 10 Sekunden oder jede halbe Minute? Das wird das Problem nicht beheben, aber wahrscheinlich reduzieren.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 28.01.19 17:26
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mo 28.01.19 18:33
Zitat: | es deutet eher darauf, dass die Methode Directory.CreateDirectory(), aus noch unbekannten Gründen, fehlschlägt. |
Die Fehlermeldung kann man eigentlich bei jedem beliebigen Dateizugriff bekommen.
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 28.01.19 18:58
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
mrtfr
Beiträge: 26
|
Verfasst: Di 29.01.19 09:23
Hey, vielen Dank für die Antworten!
C#-Quelltext 1:
| string monn = File.ReadAllText(@" >hier könnte ihr path stehen< \texte\Montag.txt", Encoding.UTF8); |
Das ist alles was passiert, deshalb verstehe ich es nicht.. Es wird nichts geschrieben oder verschoben,...
Und hier nochmal eine genauere Beschreibung:
- Angezeigt werden soll -> Tagesessen (carnetarisch und vegetarisch im wechsel von 3,75 Sekunden)
- Abgefragt werden soll es mindestens alle 5 Minuten
Danke schonmal im Voraus!
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 29.01.19 12:37
Wird die Datei von einem anderen Programm währenddessen neu beschrieben? Dann kann es natürlich sein, daß für einen kurzen Moment die Datei nicht existiert (bzw. blockiert ist)? Und dann mußt du mit allen möglichen IO-Fehlern rechnen, d.h. z.B. mittels try..catch mögliche Exceptions abfangen.
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 29.01.19 13:50
Auf was für einem Rechner (Betriebssystem) liegt das File?
Sollte das ein Standard Windows Desktop OS sein ist die Anzahl gleichzeitiger Verbindungen begrenzt. Ich glaube es sind max. 10 Gleichzeitige Verbindungen. Sollte gerade also ein 11er versuchen die Datei runterzuladen könnte ich Fehlermeldung so aussehen (ist eine Vermutung).
Warum willst du die Datei eigentlich immer runterladen? Die wird sich ja meistens nicht geändert haben oder doch?
|
|
mrtfr
Beiträge: 26
|
Verfasst: Di 29.01.19 14:52
Hi,
ja ich nutze Windows.
Danke für den tipp mit den Begrenzungen!
Und lade ich die Datei wirklich runter??? Ich dachte ich lese nur den Text aus..
|
|
Palladin007
Beiträge: 1282
Erhaltene Danke: 182
Windows 11 x64 Pro
C# (Visual Studio Preview)
|
Verfasst: Di 29.01.19 18:35
Welches Windows ist spannend, ich wette, es gibt da Unterschiede mit den Windows Server Versionen.
Und ja, wenn Du den Text liest, lädst Du im Grunde die Datei runter. Läuft zumindest auf das Gleiche heraus: Du lädst alle paar Sekunden den Inhalt der Datei
Ralfs Frage war eher, ob das überhaupt Sinn macht? Das hatte ich ja auch schon angesprochen: Wozu so oft aktualisieren? Aktualisiert sich das wirklich alle paar Sekunden, oder reicht nicht auch eine Aktualisierung alle paar Minuten?
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 29.01.19 20:41
Ich dachte eher daran nur die FileTime zu prüfen und nur das File runter zu laden bzw. den Inhalt auszulassen und runter zu laden wenn die sich auch geändert hat.
Zitat: | Welches Windows ist spannend, ich wette, es gibt da Unterschiede mit den Windows Server Versionen. |
Ein Server Windows hat zumindest keine explizit ausprogrammierte hart kodierte Begrenzung und deren Begrenzung liegt dann in ganz anderen Regionen als die 10 bei einer Desktop Windows Version.
|
|
mrtfr
Beiträge: 26
|
Verfasst: Mi 30.01.19 10:55
Palladin007 hat folgendes geschrieben : | Welches Windows ist spannend, ich wette, es gibt da Unterschiede mit den Windows Server Versionen.
Und ja, wenn Du den Text liest, lädst Du im Grunde die Datei runter. Läuft zumindest auf das Gleiche heraus: Du lädst alle paar Sekunden den Inhalt der Datei
Ralfs Frage war eher, ob das überhaupt Sinn macht? Das hatte ich ja auch schon angesprochen: Wozu so oft aktualisieren? Aktualisiert sich das wirklich alle paar Sekunden, oder reicht nicht auch eine Aktualisierung alle paar Minuten? |
Ja es reicht auch alle paar Minuten, aber trotzdem bleibt dann ja das Problem, dass es sein kann, dass zwei gleichzeitig wollen.. Die Wahrscheinlichkeit ist geringer, aber es ist möglich..
|
|
mrtfr
Beiträge: 26
|
Verfasst: Mi 30.01.19 11:02
|
|
mrtfr
Beiträge: 26
|
Verfasst: Mi 30.01.19 11:10
Th69 hat folgendes geschrieben : | Wird die Datei von einem anderen Programm währenddessen neu beschrieben? Dann kann es natürlich sein, daß für einen kurzen Moment die Datei nicht existiert (bzw. blockiert ist)? Und dann mußt du mit allen möglichen IO-Fehlern rechnen, d.h. z.B. mittels try..catch mögliche Exceptions abfangen. |
Ist dann aber nicht im nächsten Zyklus an Abfragen genau das gleiche Problem?
PC1: ----ODD----ODD----
PC2: O----OXX----OXX---
Zeit: >>>>>>>>>>>>>
- = keine Abfrage
O = Abfrage angefragt
D = Abfrage läuft
X = Abfrage abgebrochen
PC1 blockiert die Datei für PC2..
Neuer Zyklus:
PC1 blockiert wieder die Datei für PC2..
Oder sehe ich das falsch?
Kann man irgendwie verstehen, was ich meine
|
|
Th69
Beiträge: 4791
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 30.01.19 12:56
Gleichzeitiges Lesen von mehreren PCs macht überhaupt keine Probleme! Nur, wenn die Datei, wie ich schon schrieb, zwischendurch neu gespeichert wird!
Also wie häufig wird die Datei neu beschrieben?
Du könntest auch die FileSystemWatcher-Klasse benutzen, um die Datei nur bei Änderung neu zu laden.
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 30.01.19 13:04
|
|
mrtfr
Beiträge: 26
|
Verfasst: Fr 01.02.19 10:15
Th69 hat folgendes geschrieben : | Gleichzeitiges Lesen von mehreren PCs macht überhaupt keine Probleme! Nur, wenn die Datei, wie ich schon schrieb, zwischendurch neu gespeichert wird!
Also wie häufig wird die Datei neu beschrieben?
Du könntest auch die FileSystemWatcher-Klasse benutzen, um die Datei nur bei Änderung neu zu laden. |
Naja ich dachte mit READALLTEXT schreibt er garnicht neu..
|
|
Ralf Jansen
Beiträge: 4706
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 01.02.19 10:23
Zitat: | Naja ich dachte mit READALLTEXT schreibt er garnicht neu.. |
Was wir hier besprechen geht ja auch eher darum das jemand anderes die Datei ändert. Ein Datei zu lesen(von dir) die gerade geschrieben wird(von jemand anderem) ist das Problem und hier werden Lösungen vorgeschlagen wie man mit einer solchen Kollision umgehen kann. Also z.B. in dem man nicht wild ständig die Datei liest sondern nur dann wenn sich die Datei auch tatsächlich geändert hat.
|
|