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 实例将只调用一次。 当由于ChangeMonitor实例检测到更改而调用 方法时OnChanged(Object),或者在 上ChangeMonitor调用 方法时Dispose(),以先发生者为准,将发生此一次调用。
OnChangedCallback实现ObjectCache提供的实例应删除关联的缓存条目,并使用 DependencyChanged 枚举指定原因。
实例 ChangeMonitor 可以在 OnChanged(Object) 缓存实现调用方法之前或之后调用 NotifyOnChanged(OnChangedCallback) 方法。 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) 在调用 Dispose 通过 NotifyOnChanged(OnChangedCallback)注册的回调后自动调用 方法。
注意:仅当实例的初始化 ChangeMonitor 之前已完成时,才会在事件触发期间自动调用 dispose 方法。
当派生的更改监视器的构造函数调用 InitializationComplete() 方法时,如果更改监视器的状态已更改 (也就是说,当构造函数仍然处于活动状态时受监视的状态已更改) 则 InitializationComplete() 该方法将自动释放更改监视器。
- 在派生的更改监视器实例调用 方法后,无论HasChanged对象是否已OnChangedCallback通过调用 NotifyOnChanged(OnChangedCallback) 方法设置,属性都设置为
true
。OnChanged(Object)
构造函数
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) |
适用于
线程安全性
此类型是线程安全的。