Was ist der beste Weg, Daten in einer C # -Dll zwischenzuspeichern?

7

Ich habe eine DLL geschrieben, die auf verschiedene Arten verwendet werden kann (referenziert von ASP.NET-Websites, WinForms usw.). Es muss seine Daten aus mehreren Dateien mit Trennzeichen laden, die automatisch halbjährlich aktualisiert werden. Aus Leistungsgründen lade ich die Daten in ein statisches Objekt (eine generische Liste) und möchte nur zu den Dateien zurückkehren, wenn sich die Daten ändern. (Die Menge an Daten nimmt nicht unangemessen viel Speicher in Anspruch, aber es dauert zu lange, um bei jedem Zugriff von der Datei zu lesen). Ich habe versucht, einen FileSystemWatcher zu verwenden, aber das erwies sich als unzuverlässig - es fehlten regelmäßig Dateiaktualisierungen. Da ich nicht darauf zählen kann, dass die DLL in einer Website ausgeführt wird, scheint die ASP.NET CacheDependency-Option nicht geeignet. Hat jemand eine gute Lösung für so etwas gefunden?

    
Jeremy Gruenwald 20.01.2009, 21:58
quelle

4 Antworten

6

Haben Sie sich den Caching-Anwendungsblock der Enterprise Library angeschaut ? Es ermöglicht die Ungültigkeitserklärung des Cache bei einer Reihe verschiedener Ereignisse, einschließlich Dateiänderungen (AFAIK), und erfordert kein ASP.NET (und integriert sich dennoch gut damit).

    
casperOne 20.01.2009, 22:03
quelle
14

Der ASP.NET-Cache und die zugehörige CacheDependency haben keine Abhängigkeit von ASP.NET, IIS oder einem Webserver. Sie können es für diese genaue Situation verwenden. Es erfordert viel weniger Aufwand als der Caching Application Block der Enterprise Library und wird häufiger verwendet und dokumentiert.

Einige zusätzliche Referenz: Ссылка

Wenn Sie die ASP.NET-Cache-Logik in Ihrer DLL verwenden möchten, wickeln Sie sie einfach um und verweisen Sie wie folgt:

%Vor%

Dieser Code wird zusammen mit jeder FileSystemDependency, die Sie hinzufügen möchten, genauso gut in Ihrer Bibliothek funktionieren, unabhängig davon, ob er in einem Web-, WinForm-, Konsolen- oder Dienstkontext ausgeführt wird oder nicht.

Sie können dies auch tun, wenn Sie sicher sein möchten, dass Sie den gleichen Cache wie das Web verwenden, aber es ist optional:

%Vor%     
ssmith 28.01.2009 04:37
quelle
2

Sie können das letzte Datum, das Sie aus der Datei geladen haben, als eine andere Datei im selben Verzeichnis oder in einer statischen Datumszeit in Ihrer Klasse speichern. Ich denke, dass die letzte Lösung wahrscheinlich nicht das ist, wonach Sie suchen, da Sie nicht darauf zählen können, dass Ihre Klasse geladen wird. Ich würde auch in Betracht ziehen, einen MD5-Hash der Datei zu speichern und zu vergleichen, um zu sehen, wann sie sich ändert.

    
Anthony D 20.01.2009 22:05
quelle
1

Meine Lösung für dieses Problem bestand darin, die Datendatei regelmäßig neu zu laden: zum Beispiel einmal pro Stunde. Es hängt davon ab, wie wichtig es ist, dass Ihr Programm minutengenaue Daten enthält.

Vielleicht ist ein hybrider Ansatz gefragt. Verwenden Sie FileSystemWatcher, speichern Sie aber auch das Datum / die Uhrzeit der letzten Datei (wie oben empfohlen) und überprüfen Sie regelmäßig das aktuelle Datum / die aktuelle Uhrzeit in der Datei. Wenn sie sich unterscheiden, laden Sie die Datei erneut. Das wäre meine bevorzugte Lösung, wenn es wichtig wäre, die Daten auf dem neuesten Stand zu halten.

Sie können auch so einrichten, dass Ihr Programm benachrichtigt wird, wenn es die Daten neu laden muss.

    
Jim Mischel 20.01.2009 23:16
quelle

Tags und Links