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
をカプセル化します。