Hallo Zusammen,
ich hätte mal eine Frage an euch wie Ihr am besten eine Erinnerungsfunktion programmieren würde. Aktuell für noch kein geplantes Projekt, rein mal aus Interesse heraus.
Also Grundlage soll z.B. eine SQL Datenquelle gegeben sein. In der Termine, Aufgaben, Eskalationen oder ähnliche Sachen gespeichert sein könnten.
Egal was es nun ist, angenommen es gibt dann eine Spalte mit einem Ablauf/Erinnerungsdatum, sobald dieses überschritten wird, soll eine Aktion (Event) ausgeführt werden. Wie würdet Ihr so etwas am besten programmieren.
Bitte nur Vorschläge die man auch als Performant ansehen kann, z.B. gehen wir mal von 100.000 Datensätzen aus.
Das einzige was mir jetzt gerade dazu einfallen würde, wäre ein Timer der jede Minute die SQL mit einem Zeitfilter(Now + 1 Minute) abfrägt.
Nachteile die ich hier sehe:
Wie würdet Ihr so etwas lösen?
MfG
Nighty2k
Hallo nighty2k,
wäre ein Timer der jede Minute die SQL...Nur auf die Minute genau.
Wer hat schon Erinnerungen auf die Sekunde genau eingeplant.
Bitte nur Vorschläge die man auch als Performant ansehen kann, z.B. gehen wir mal von 100.000 Datensätzen aus.
M.E. ist diese Zahl etwas hoch angesetzt, aber naja.
Da ich aber denke dass nicht so viele Datensätze zusammenkommen kannst du auch wie im Outlook je nach Granularität, Tag, Arbeitswoche,Woche,Monat,Jahr laden. Und dies je nach dem was angezeigt wird laden. Wenn dann Monat gewechselt wird, wird der andere Monat geladen. Dies ist auch die übliche vorgehensweise.
Eine Möglichkeit wäre beim Programmstart mir wie du bereits sagtest ein Zeitfenster an Daten laden, dies jedoch nicht alle Minuten und ein Zeitfenster von +1min, sondern lade beim Start den gesamten heutigen Tag. Eventuell kannst du ja noch alle x-Stunden die Daten aktualisieren und oder die Daten von morgen+ wenn gewünscht nachladen.
Gruß
Michael
Hallo nighty2k,
eine statische Klasse Notification anlegen. In der Klasse einen Timer mit einem Interval von z.B. 1 Minute festlegen. In der OnTick-Methode prüfen, ob was in der Datenbank vorhanden ist. Wenn ja, ein Event feuern. Verwende am besten eigens programmierte Events. Mehr findets du hier [FAQ] Eigenen Event definieren / Information zu Events. Anschließend kannst du dich an Events dranhängen und schauen, was für ein Termin oder was auch immer es ist.
Wenn du in einem bestimmten Intervall etwas prüfen möchtest, bleibt dir nichts anderes übrig, als einen Timer zu verwenden. Anders wird es wohl nicht gehen. Eine Abfrage musst du sowieso an die Datenbank schicken. Wie möchtest du sonst prüfen, ob etwas da ist oder nicht? Besser ist es natürlich, wenn du nicht die komplette Datenbank abfragst, sondern nur ein bestimmtes "Zeitfenster".
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
Danke euch, dann war mein Ansatz ja schon mal gar nicht so schlecht, freut mich 😃
Ein konkretes Beispiel, was mir jetzt wieder eingefallen ist und schon eine Weile im Kopf herum schwirrt wäre z.B. ein Ticketsystem, welches z.B. ein Popup bei Überschreitung einer maximalen Wartezeit ausgeben soll.
Wegen der großen Zahl von 100k, so unrealistisch finde ich die nicht, wenn ich Software schreibe, will ich diese ja natürlich auch so funktionell wie möglich machen.
Bleiben wir bei dem Beispiel eines Ticketsystem, 100.000 / 365 Tage / 5 Jahre sind nur noch 54 Tickets pro Tag, also durchaus machbar.
Wobei wie schon gesagt am sinnvollsten wäre denk ich mal sowieso die Filterfunktionen einer SQL zu nutzen, dafür gibt es ja SQL, also where != erledigt + zeitraum somit ist man noch bei einer handvoll Tickets über.
Danke für dem Tipp mit der Notification Class, bei MSDN hab ich leider nur eine Notification Class im Bezug auf Win CE gefunden, hättest evtl. eine Info Quelle.
Grüße
Matthias
Hallo!
@nighty2k:
Bei SQL gibt es auch für WHERE -Conditions das between-Schlüsselwort, um bei Zahlen oder Datumswerten einen bereich zu definieren.
Nobody is perfect. I'm sad, i'm not nobody 🙁
Danke für dem Tipp mit der Notification Class, bei MSDN hab ich leider nur eine Notification Class im Bezug auf Win CE gefunden, hättest evtl. eine Info Quelle.
Ich denke, gemeint war: Du sollst Dir eine eigene, statische Klasse schreiben... ob Du die nun Notification, Reminder oder Donaudampfschifffahrtskapitaen nennst, bleibt Dir überlassen. Notification wäre aber ein naheliegender Name 😉
Hi,
was dir sicher bei deinem Vorhaben noch hilft ist dieses super Projekt :
http://quartznet.sourceforge.net/
huhu,
"Outlook" benachrichtigt mich gerade mal Minutengenau - auch sind Sekunden-Timer etwas überdimensioniert.
Ich würde eine Mischung machen: Erst die "die Events während des Tages abrufen" - das sind diejenigen, für welche informiert werden muss.
Zusätzlich gibt es aber jene, welche Tagsüber von anderen in die DB eingefügt werden. Klar kann man diese per polling "jede Sekunde" aus der DB abholen, aber naja, polling ist immer schlecht.
Dafür gibt es in diesem Fall SqlDependency. Schick eine Abfrage an den SQL-Server und du bekommst Antwort wenn sich das ursprüngliche Ergebnis ändert (also ein Datensatz dazu kommt oder sich der Zeitpunkt ändert).
😃
Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.