0

私の運用サーバーには、頻繁に使用される SQL Server インスタンスと、ac# Windows サービスであるアプリケーションがあります。私のサービスは、さまざまな時間にさまざまなジョブを実行します。24 時間ごとに、さまざまなジョブの進行状況に関する最新情報を提供する電子メールが送信されます。

このコードは、メモリ キャッシュ内のフラグをチェックして、電子メールを送信するかどうかを決定します。コードは次のようになります。

if (Common.MemCache.Get(Common.MemoryCacheActions.DailyEmail) == null)
{
    Common.Logger.Info("Collating email data.");
    Common.MemCache.Add(Common.MemoryCacheActions.DailyEmail, String.Empty, DateTime.Now.AddHours(24));

    SendEmail();
}

私のメイン ループは約 1 分ごとに null エントリをチェックしているため、大量の電子メールを受信して​​います。Add が失敗したか、アイテムが削除されたかのように見えますか?

十分なメモリが利用できない場合にアイテムが削除される可能性がある場所を読みました。これが発生した時点で、メンテナンス スクリプトが SQL Server で実行されており、ボックスで使用可能なメモリはほとんどゼロでした。サーバー、chrome、SSMS などで実行していたいくつかのプログラムを閉じたところ、ログ エントリや電子メールがなくなりました。

アイテムの有効期限を明示的に [現在 + 24 時間] に設定しているので、アイテムが 24 時間追加されることを期待しています!

ここでの解決策は何ですか? CacheItemPriority を NotRemoveable に設定し、24 時間後に手動でアイテムを削除する必要がありますか?

キャッシュをどのように使用しているかという点を無効にしますか、または NotRemovable は AbsoluteExpirationDate と連携して機能しますか?

4

2 に答える 2

1

使用できます

MemoryCache.CreateCacheEntryChangeMonitor()

指定されたキャッシュ エントリへの変更に応答してイベントをトリガーできる CacheEntryChangeMonitor オブジェクトを作成します。

関連するアイテムがキャッシュから削除されているかどうかを確認します。

このメソッドはCacheEntryChangeMonitorインスタンスを返します。このインスタンスのNotifyOnChangedメソッドは、キャッシュが変更されたときに呼び出されるコールバック メソッドを提供するために使用されます。

また、サービスが再起動していないことを確認します。おそらくクラッシュしており、クラッシュ時に再起動するように設定されていますか?

于 2014-10-21T22:37:03.990 に答える