Entwickler-Ecke

IO, XML und Registry - Mehrere Zugriffe auf eine Datei (120 User, alle 3,75 Sekund)


mrtfr - Mo 28.01.19 16:10
Titel: Mehrere Zugriffe auf eine Datei (120 User, alle 3,75 Sekund)
Hi,

ich habe ein Programm erstellt, welches unter anderem das Tagesessen in unserer Kantine anzeigen soll. Das lief auch alles super, bis zum deploy. :oops:
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 user profile iconChristian S.: Topic aus WinForms verschoben am Di 29.01.2019 um 10:32


Palladin007 - Mo 28.01.19 16: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.


Delete - Mo 28.01.19 18:26

- Nachträglich durch die Entwickler-Ecke gelöscht -


Ralf Jansen - Mo 28.01.19 19: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.


Delete - Mo 28.01.19 19:58

- Nachträglich durch die Entwickler-Ecke gelöscht -


mrtfr - Di 29.01.19 10: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 - Di 29.01.19 13: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 - Di 29.01.19 14: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 - Di 29.01.19 15: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 - Di 29.01.19 19: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 - Di 29.01.19 21:41

Ich dachte eher daran nur die FileTime [https://docs.microsoft.com/de-de/dotnet/api/system.io.file.getlastwritetimeutc] 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 - Mi 30.01.19 11:55

user profile iconPalladin007 hat folgendes geschrieben Zum zitierten Posting springen:
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 - Mi 30.01.19 12:02

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Ich dachte eher daran nur die FileTime [https://docs.microsoft.com/de-de/dotnet/api/system.io.file.getlastwritetimeutc] 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.


Auf unserem File läuft WinServer 2012 R2.


mrtfr - Mi 30.01.19 12:10

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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 :lol:


Th69 - Mi 30.01.19 13: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 [https://docs.microsoft.com/de-de/dotnet/api/system.io.filesystemwatcher?view=netframework-4.7.2]-Klasse benutzen, um die Datei nur bei Änderung neu zu laden.


Ralf Jansen - Mi 30.01.19 14:04

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Du könntest auch die FileSystemWatcher [https://docs.microsoft.com/de-de/dotnet/api/system.io.filesystemwatcher?view=netframework-4.7.2]-Klasse benutzen, um die Datei nur bei Änderung neu zu laden.


100+ FileSystemWatcher auf ein NetworkShare? Das klingt völlig problemlos :roll:


mrtfr - Fr 01.02.19 11:15

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
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 [https://docs.microsoft.com/de-de/dotnet/api/system.io.filesystemwatcher?view=netframework-4.7.2]-Klasse benutzen, um die Datei nur bei Änderung neu zu laden.


Naja ich dachte mit READALLTEXT schreibt er garnicht neu..


Ralf Jansen - Fr 01.02.19 11: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.