ChangeMonitor 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
为派生的自定义类型提供基类,用于监视缓存项所依赖的数据状态的更改。
public ref class ChangeMonitor abstract : IDisposable
public abstract class ChangeMonitor : IDisposable
type ChangeMonitor = class
interface IDisposable
Public MustInherit Class ChangeMonitor
Implements IDisposable
- 继承
-
ChangeMonitor
- 派生
- 实现
注解
该 ChangeMonitor 类用作专用于特定缓存实现的派生监视器类的基类。 ChangeMonitor实例监视缓存项所依赖的数据状态的更改。 例如,该项可以是缓存其内容的文件或数据实体。 如果文件或数据实体已更新,则还必须更改关联的缓存条目。 可监视的常见项包括数据实体(例如数据库字段、值、行或表)、其他缓存项以及文件和文件属性。
依赖项更改是依赖项状态的更改。 在典型的缓存实现中,实例通知缓存依赖项已更改后 ChangeMonitor ,缓存将执行所需的操作,例如使插入的缓存项失效。
ChangeMonitor可以自定义派生类,以监视特定不同数据存储的依赖项更改。 例如,文件系统、物理内存或数据库都有缓存实现。 该 ChangeMonitor 类检查缓存外部发生的更改,然后通知缓存已发生更改。
.NET Framework 包括派生自 ChangeMonitor 类的以下类:
其中每个类都适用于不同类型的依赖项。 例如,派生 FileChangeMonitor 类监视对缓存项所依赖的文件系统数据(文件和文件夹)缓存的更改。
实施者说明
如果创建自定义缓存实现或派生的更改监视器类型,则必须遵循某些准则。 以下列表汇总了这些准则。 有关详细信息,请参阅各个方法或属性的文档。
派生类的构造函数必须在方法返回之前设置 UniqueId 属性、开始监视和调用 InitializationComplete() 方法。 如果在构造过程中构造函数遇到错误,并且必须释放资源,则构造函数只能在调用方法后InitializationComplete()调用Dispose重载,因为在初始化未完成时,Dispose重载将引发InvalidOperationException异常。
如果在初始化完成之前正在监视的数据中发生更改,构造函数必须在调用InitializationComplete()该方法之前调用OnChanged(Object)该方法。
实例化派生 ChangeMonitor 类型后,必须将监视器插入到自定义 ObjectCache 实现中。 或者,如果已完成更改监视器,请调用该方法 Dispose 。
ChangeMonitor将实例插入ObjectCache到实现中后,ObjectCache该实例要求释放更改监视器。 即使插入无效并导致异常, ObjectCache 实现也必须调用 Dispose 重载。
将派生的更改监视器插入缓存后,ObjectCache实现必须通过传递OnChangedCallback对象来调用NotifyOnChanged(OnChangedCallback)。 NotifyOnChanged(OnChangedCallback)方法只能调用一次。 如果已发生依赖项更改, OnChangedCallback 则调用实例时 NotifyOnChanged(OnChangedCallback) 将立即调用。 否则, OnChangedCallback 将只调用一次实例。 当调用方法时OnChanged(Object)发生此一次调用,因为ChangeMonitor实例检测到更改,或者在调用ChangeMonitor该方法时Dispose()(以先发生者为准)。
OnChangedCallback实现提供的ObjectCache实例应删除关联的缓存项,并使用枚举指定原因DependencyChanged。
ChangeMonitor实例可以在缓存实现调用NotifyOnChanged(OnChangedCallback)方法之前或之后调用OnChanged(Object)该方法。 OnChanged(Object)如果在调用之前NotifyOnChanged(OnChangedCallback)调用该方法,则基本ChangeMonitor实现将通知缓存已发生此问题,并触发在调用时NotifyOnChanged(OnChangedCallback)立即传递给NotifyOnChanged(OnChangedCallback)的回调。 传递给OnChanged(Object)该方法的任何状态数据都由更改监视器保存,随后在调用该方法时NotifyOnChanged(OnChangedCallback)传递给NotifyOnChanged(OnChangedCallback)该方法。
更改监视器必须实现 Dispose(Boolean) 该方法。 有关详细信息,请参阅 Dispose(Boolean) 方法文档。
Dispose()必须调用方法重载来释放ChangeMonitor实例。 调用 Dispose 的规则如下所示:
在将项插入缓存之前,调用方负责释放 ChangeMonitor 实例。
缓存项及其 ChangeMonitor 关联的实例传递到缓存后,缓存实现程序必须确保 Dispose 调用该方法(即使插入失败)。
将项及其关联的 ChangeMonitor 实例传递到缓存后,调用方不得释放依赖项,因为调用方法时 Dispose ,调用将被视为依赖项已更改。 因此, OnChanged(Object) 会自动调用该方法。
考虑到这些规则, Dispose 必须通过以下方式之一调用该方法:
如果用户决定不将派生的更改监视器实例插入缓存,则必须调用 Dispose() 方法重载。
如果实现尝试将更改监视器实例插入对象缓存,但插入失败,则缓存实现负责调用 Dispose() 重载。 当插入尝试导致异常时,缓存实现必须释放任何关联的依赖项。
如果删除缓存条目,缓存实现还必须释放依赖项。
该方法的内部实现OnChanged(Object)在调用通过NotifyOnChanged(OnChangedCallback)注册的回调后自动调用Dispose该方法。
注意:仅在之前完成实例的初始化 ChangeMonitor 时,才会在事件触发期间自动调用 dispose 方法。
当派生的更改监视器的构造函数调用 InitializationComplete() 该方法时,如果更改监视器的状态已更改(即当构造函数仍然处于活动状态时监视的状态)时,该方法 InitializationComplete() 将自动释放更改监视器。
- 属性HasChanged在派生的更改监视器实例调用方法后OnChanged(Object)设置为
true,而不管对象是否已OnChangedCallback由对方法的调用NotifyOnChanged(OnChangedCallback)设置。
构造函数
| 名称 | 说明 |
|---|---|
| ChangeMonitor() |
初始化 ChangeMonitor 类的新实例。 从派生类中的构造函数调用此构造函数以初始化基类。 |
属性
| 名称 | 说明 |
|---|---|
| HasChanged |
获取一个值,该值指示由 ChangeMonitor 类监视的状态已更改。 |
| IsDisposed |
获取一个值,该值指示释放类 ChangeMonitor 的派生实例。 |
| UniqueId |
获取一个表示 ChangeMonitor 类实例的值。 |
方法
| 名称 | 说明 |
|---|---|
| Dispose() |
释放类的当前实例 ChangeMonitor 使用的所有资源。 |
| Dispose(Boolean) |
释放所有托管和非托管资源以及对该 ChangeMonitor 实例的任何引用。 此重载必须由派生的更改监视器类实现。 |
| Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
| GetHashCode() |
用作默认哈希函数。 (继承自 Object) |
| GetType() |
获取当前实例的 Type。 (继承自 Object) |
| InitializationComplete() |
从派生类的构造函数调用,以指示初始化已完成。 |
| MemberwiseClone() |
创建当前 Object的浅表副本。 (继承自 Object) |
| NotifyOnChanged(OnChangedCallback) |
由缓存实现者调用以注册回调,并在依赖项发生更改时通过ObjectCache委托通知OnChangedCallback实例。 |
| OnChanged(Object) |
由派生类调用,以在依赖项更改时引发事件。 |
| ToString() |
返回一个表示当前对象的字符串。 (继承自 Object) |
适用于
线程安全性
此类型是线程安全的。