Hi,
ich möchte eine Highscore in meiner Webseiten-App benutzen. Der User erledigt Aufgaben, die Zeit die er dafür braucht wird gestoppt und die 5 schnellsten Zeiten sollen in einer Highscoreliste angezeigt werden.
Geht auch alles, ABER ... ich hab Schwierigkeiten die Daten zu Persistieren.
1. Lösungsidee: War die Highscore per Dependency Injection AddSingelton einfach für so lange wir der Server die App laufen hat zu speichern und so jedem Besucher die Werte anzeigen zu können.
Problem: Meine Webhoster schaltet die App nach ca. 20 Minuten ohne Seiten Aktivität von Benutzern aus. Das heiß der Speicher hat bei einem erneuten Aufruf wieder die Default Highscorewerte :(.
2. Lösungsidee: Ich müsste eine Datenbank anknüpfen.
Problem: Da hab ich zwar eine kostenlose Lösung, bei der gibt es aber Zugriffslimits (1000 Zugriffe pro Tag oder so). Auch wenn das Limit wohl locker reichen würde. Lieber wäre mir eine andere Lösung.
3. Lösungsidee: Lokal auf dem Server die Daten in einer .json speichern.
Problem: Wie mache ich es, dass es nicht zu Schwierigkeiten kommt bei gleichzeitigem Lesen/Schreiben der Datei? Ich hab rumgegoogelt und dachte das ReadWriteLockSlim die richtige Class wäre, um das zu machen. Bekomme das aber nicht hin.
Die Highscore Daten würden ja häufig gelesen werden und nur selten geschrieben werden. Daher dachte ich das das mit einer Datei doch gehen könnte.
Mein Code fürs Schreiben sieht so aus:
Der Fehler den ich bekomme sieht so aus.
Ich starte lokal die App aus VisualStudio alles funktioniert, auch das Speichern/Lesen der Highscore Datei. ABER wenn ich dann ein zweites mal 'spiele' den Browser geöffnet lasse und erneut alles wie beim ersten mal mache bekomme ich folgende Fehlermeldung im Browser:
Mit Verweiss auf die Zeile 12. in meinem Code.
Im gesamten Code ist das die einzige Stelle wo ich ReadWriteLockSlim benutze.
Jemand eine Idee was ich falsch mache, oder einen besseren Lösungsansatz? Danke ... LG nogood
ich möchte eine Highscore in meiner Webseiten-App benutzen. Der User erledigt Aufgaben, die Zeit die er dafür braucht wird gestoppt und die 5 schnellsten Zeiten sollen in einer Highscoreliste angezeigt werden.
Geht auch alles, ABER ... ich hab Schwierigkeiten die Daten zu Persistieren.
1. Lösungsidee: War die Highscore per Dependency Injection AddSingelton einfach für so lange wir der Server die App laufen hat zu speichern und so jedem Besucher die Werte anzeigen zu können.
Problem: Meine Webhoster schaltet die App nach ca. 20 Minuten ohne Seiten Aktivität von Benutzern aus. Das heiß der Speicher hat bei einem erneuten Aufruf wieder die Default Highscorewerte :(.
2. Lösungsidee: Ich müsste eine Datenbank anknüpfen.
Problem: Da hab ich zwar eine kostenlose Lösung, bei der gibt es aber Zugriffslimits (1000 Zugriffe pro Tag oder so). Auch wenn das Limit wohl locker reichen würde. Lieber wäre mir eine andere Lösung.
3. Lösungsidee: Lokal auf dem Server die Daten in einer .json speichern.
Problem: Wie mache ich es, dass es nicht zu Schwierigkeiten kommt bei gleichzeitigem Lesen/Schreiben der Datei? Ich hab rumgegoogelt und dachte das ReadWriteLockSlim die richtige Class wäre, um das zu machen. Bekomme das aber nicht hin.
Die Highscore Daten würden ja häufig gelesen werden und nur selten geschrieben werden. Daher dachte ich das das mit einer Datei doch gehen könnte.
Mein Code fürs Schreiben sieht so aus:
C#-Quellcode
- public async Task SaveHsFile(PlayerPoco player)
- {
- using ReaderWriterLockSlim myWriteLock = new();
- myWriteLock.EnterWriteLock();
- try
- {
- var jsonString = JsonSerializer.Serialize<List<HighScoreEntry>>(player.GameHsList);
- await File.WriteAllTextAsync(player.GameHsFileName, jsonString);
- }
- finally
- {
- myWriteLock.ExitWriteLock();
- }
- }
Der Fehler den ich bekomme sieht so aus.
Ich starte lokal die App aus VisualStudio alles funktioniert, auch das Speichern/Lesen der Highscore Datei. ABER wenn ich dann ein zweites mal 'spiele' den Browser geöffnet lasse und erneut alles wie beim ersten mal mache bekomme ich folgende Fehlermeldung im Browser:
[2021-11-19T21:25:27.513Z] Error: System.Threading.SynchronizationLockException: The write lock is being released without being held.
at System.Threading.ReaderWriterLockSlim.ExitWriteLock()
Mit Verweiss auf die Zeile 12. in meinem Code.
Im gesamten Code ist das die einzige Stelle wo ich ReadWriteLockSlim benutze.
Jemand eine Idee was ich falsch mache, oder einen besseren Lösungsansatz? Danke ... LG nogood
codewars.com Rank: 4 kyu