7

さまざまな方法で使用できるDLLを作成しました(ASP.NET Webサイト、WinFormsなどで参照されます)。半定期的に自動的に更新されるいくつかの区切られたファイルからデータをロードする必要があります。パフォーマンス上の理由から、静的オブジェクト(汎用リスト)にデータをロードしており、データが変更されたときにのみファイルに戻りたいと考えています。(データの量が不当な量のメモリを消費することはありませんが、アクセスのたびにファイルから読み取るのに時間がかかりすぎます)。FileSystemWatcherを使用してみましたが、信頼性が低いことが証明されています。ファイルの更新が定期的に見落とされます。Webサイト内で実行されているDLLを信頼できないため、ASP.NETCacheDependencyオプションは適切ではないようです。誰かがこの種のことに対する良い解決策を見つけましたか?

4

4 に答える 4

14

ASP.NET キャッシュと関連する CacheDependency は、ASP.NET、IIS、または Web サーバーに依存しません。この正確な状況に自由に使用できます。Enterprise Library Caching Application Block よりもはるかに少ない労力で動作し、より広く使用され、文書化されています。

追加の参照: http://aspalliance.com/1705_A_New_Approach_to_HttpRuntimeCache_Management.all

DLL で ASP.NET キャッシュ ロジックを使用する場合は、次のようにラップして参照するだけです。

using System.Web.Caching;
...
var cache = HttpRuntime.Cache;
cache.Insert("foo", foo);

このコードは、追加したい FileSystemDependency と共に、Web、winform、コンソール、またはサービス コンテキストで実行されているかどうかに関係なく、ライブラリで同様に機能します。

Web と同じキャッシュを確実に使用したい場合は、これを行うこともできますが、オプションです。

HttpContext context = HttpContext.Current;
            if(context != null)
            {
                _cache = context.Cache;
            }
            else
            {
                _cache = HttpRuntime.Cache;
            }
于 2009-01-28T04:37:52.697 に答える
6

Enterprise Library Cachingアプリケーションブロックを見たことがありますか?これにより、ファイルの変更(AFAIK)を含むさまざまなイベントでのキャッシュの無効化が可能になり、ASP.NETは必要ありません(それでも、ASP.NETとうまく統合されます)。

于 2009-01-20T22:03:51.257 に答える
2

ファイルから最後にロードした日付を同じディレクトリ内の別のファイルとして保存することも、クラスの静的な日時に保存することもできます。クラスがロードされていることを期待できないため、最後の解決策はおそらくあなたが探しているものではないと思います。また、ファイルのMD5ハッシュを保存して比較し、いつ変更されるかを確認することも検討します。

于 2009-01-20T22:05:27.040 に答える
1

この問題に対する私の解決策は、データ ファイルを定期的に (たとえば 1 時間に 1 回) 再読み込みすることでした。プログラムが正確なデータを正確に保持することがどれほど重要かによって異なります。

ハイブリッドなアプローチが求められているのかもしれません。FileSystemWatcher を使用しますが、最後のファイルの日付/時刻も保存し (上記で提案したように)、ファイルの現在の日付/時刻を定期的に確認します。異なる場合は、ファイルをリロードします。データを最新の状態に保つことが重要な場合は、それが私の好ましい解決策です。

データをリロードする必要があるときにプログラムに通知する方法を構築することもできます。

于 2009-01-20T23:16:07.117 に答える