INamedCacheインタフェースには、キャッシュ・コンテンツの変更時に発行されるイベントを受信する、キャッシュ・リスナーを追加する機能があります。このイベントはサーバーから送信され、バックグラウンド・スレッドによって登録済のリスナーにディスパッチされます。
.NETのシングルスレッド・アパートメント・モデルでは、あるスレッドで作成されたWindowsフォームのコントロールを別のスレッドで更新することが禁止されています。イベント通知の結果として1つ以上のコントロールを更新する場合は、キャッシュ・イベントへの応答として実行する必要のあるイベント処理コードをUIスレッド上で実行する必要があります。WindowsFormsCacheListenerヘルパー・クラスを使用すれば、エンド・ユーザーはこの事実を意識することなく、Coherenceキャッシュ・イベント(発生元は常にバックグラウンド・スレッド)をUIスレッドで発生したイベントと同様に処理できます。このクラスにより、コールがUIスレッド上で適切にマーシャリングされて実行されるようになります。
このクラスの使用例を次に示します。
例20-1 UIスレッドでのコールのマーシャリングと実行
public partial class ContactInfoForm : Form
{
...
listener = new WindowsFormsCacheListener(this);
listener.EntryInserted += new CacheEventHandler(AddRow);
listener.EntryUpdated += new CacheEventHandler(UpdateRow);
listener.EntryDeleted += new CacheEventHandler(DeleteRow);
...
cache.AddCacheListener(listener);
...
}
AddRow、UpdateRowおよびDeleteRowの各メソッドは、キャッシュ・イベントに応じてコールされます。
例20-2 キャッシュ・イベントに応じたメソッドのコール
private void AddRow(object sender, CacheEventArgs args)
{
...
}
private void UpdateRow(object sender, CacheEventArgs args)
{
...
}
private void DeleteRow(object sender, CacheEventArgs args)
{
...
}
CacheEventArgsパラメータは、キャッシュ・イベントを発生させたIObservableCacheインスタンス、発生したCacheEventType、およびキャッシュされたエントリのKey、NewValue、OldValueをカプセル化します。