hallo,
ich möchte eine asp.net 2.0 applikation (browsergame zum lernzweck) erstellen, die u.a. folgende funktion bietet:
ein benutzer kann eine aktionen durchführen, die jeweils ein gewisse zeit dauert, bis sie abgeschlossen ist, z.b. gebäude bauen / dauer 2 stunden.
prinzipiell sollen alle daten in einer sql datenbank persistiert werden - das ist kein problem - also eintrag in event table mit startzeit und dauer.
aber was mache ich nun nach den 2 stunden? wie kann meine applikation auf so ein ereignis reagieren (user muss natürlich nicht mehr online sein).
meine 1. idee war, im glolabl.asax einfach eine art eventmanagement zu installieren, und die app überprüft dann z.b. jede sekunde ob zu diesem zeitpunkt ein ereignis stattfinden sollte, und führt dann die entsprechenden methoden aus etc.
das ist dann aber im prinzip polling - sehr lame denke ich mal. gibt es ein eingebautes scheduling / callback etc. das ich für sowas verwenden könnte? oder baut man so etwas sogar in die datenbank ein?
meine 2. idee war, viele timer zu generieren, die dann jeweils nach ablauf die aktion durchführen. das kommt mir aber auch komisch vor, denn was passiert wenn z.b. der server kurz ausfällt, dann habe ich zwar die persistierten db daten, aber muss wieder alle timer erstellen usw...
naja das ganze klingt mir zu sehr nach noob pfusch, daher hoffe ich, dass mir jemand weiterhelfen kann 🙂
mfg Gronkzor
Das ist imho nicht mehr Aufgabe von ASP.NET - hier würde sich ein Windows-Dienst oder aber zumindest ein per Windows-Scheduler aufgerufenes Konsolen-Tool anbieten, was dann alle paar Minuten oder Sekunden "nachschaut". Das setzt natürlich voraus, dass du Zugriff auf den Server oder einen netten Admin hast, der dir das einrichtet.
hm danke, aber genau das "jede sekunde nachschauen" wollte ich vermeiden - egal ob per externem tool oder aus asp.net heraus
Wie soll es denn anders funktionieren? Irgendwo muss ja der Anstoß herkommen "mach jetzt was".
naja das wollte ich eigentlich wissen 🙂
wenn ich nichts neues herausfinde, werde ich es so machen:
jedes event trägt sich in eine sortierte liste ein, die in global.asax definiert wird. dann wird genau ein timer erstellt, der bis zum frühesten event wartet, und dann die aktion durch führt. dann wird wieder ein neuer timer auf das nächste element erstellt usw.
damit muss ich nicht mehr pollen und habe trotzdem nur einen einzigen timer.
erspart mir busy waiting und polling... wenns klappt 🙂
zusätzlich werden die events auch in einen db table geschrieben, aus dem beim start der applikation die liste neu erstellt wird (für den fall eines absturzes / ausfalls des servers).
mfg Gronk
In der Theorie liest sich das gut, praktisch wird das aber bei einer hochfrquentierten Anwendung Probleme in der Performance mit sich bringen, weil du CPU-Zeit und Speicher klaust, was eigentlich nicht nötig wäre, wenn sich ein eigener Dienst darum kümmern würde.
hm ja um die performance habe ich mir auch schon gedanken gemacht, aber wieso soll das mehr verbrauchen als ein dienst der jede sekunde aufgerufen wird? gibts da einen trick?
Mehr verbrauchen vielleicht nicht, aber es blockiert und lähmt den ASP.NET-Workerprocess. Wenn du das von einem anderen Prozess erledigen lässt, ist die Balance wahrscheinlich besser.
Der Trick ist für mich der Griff zum Windows-Dienst 😉
hm.. dann mache ich am besten einen eigenen dienst, der die liste mit events verwaltet und dann timer generiert 🙂 das ist dann quasi die kombination, und das elende polling bleibt aussen vor.
äh... wie macht man einen dienst? gg gibts ein tutorial?
Da müsstest du hier mal das Forum wechseln. Viel Erfolg 😉
Hallo,
zum Ertsellen von Diensten:
Windows Services mit C#
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hallo,
zum Ertsellen von Diensten:
Windows Services mit C#
edit: sry für doppelpost
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca