IChangeToken
接口主要用于提供更改通知。它定义了以下成员:
hasChanged
:只读属性,用于指示当前的IChangeToken
是否已发生变化。如果数据发生变化,该属性将变为true
。activeChangeCallbacks
:只读属性,用于表示当数据发生变化时,是否主动执行注册的回调函数。通常该值设置为true
,如果设置为false
,则不会调用回调。registerChangeCallback(Action<object> callback, object state)
:该方法用于注册一个当数据发生变化时自动执行的回调函数。它接受一个Action<object>
类型的回调函数和一个可选的object
类型的状态参数。注册成功后会返回一个IDisposable
对象,可使用其Dispose
方法解除注册的回调函数。
在实际使用中,并不需要自己实现IChangeToken
接口,框架中已经有现成的实现。例如,在文件系统中,PhysicalFileProvider
的watch
方法在监测到文件变化时会返回一个IChangeToken
;在配置系统中,ConfigurationReloadToken
用于重新加载配置数据。
通过使用IChangeToken
,可以在数据发生变化时得到通知,从而进行相应的处理,而无需直接使用事件或紧密耦合相关对象。例如,当配置源发生改变时,可以通知配置的使用者重新加载。
下面是一个使用IChangeToken
监测文件变化的示例代码:
收起
csharp
复制
using var fileProvider = new PhysicalFileProvider("d:\\test"); IChangeToken changeToken = fileProvider.Watch("test.txt"); changeToken.RegisterChangeCallback(_ => { Console.WriteLine("file changed!", ConsoleColor.DarkGreen); }, ""); for (int i = 0; i < 3; i++) { Console.WriteLine("add text to file", ConsoleColor.DarkGray); await file.AppendAllTextAsync(@"d:\test\test.txt", DateTime.Now.ToString()); await Task.Delay(2000); }
在上述代码中,通过PhysicalFileProvider
的watch
方法获取一个IChangeToken
,然后注册一个回调函数。当文件发生变化时,回调函数将被执行。
然而,这样得到的IChangeToken
通常具有“一次性”的特征,即使用一次后就会失效。如果想要持续监测变化并每次都触发回调,可以使用ChangeToken
类的OnChange
方法。ChangeToken
是一个静态类,它提供了OnChange
方法用于注册回调。
例如:
收起
csharp
复制
ChangeToken.OnChange(() => fileProvider.Watch("test.txt"), () => Console.WriteLine("file changed!", ConsoleColor.DarkGreen));
这样,每次文件发生变化时,都会自动执行传入的回调函数。
ChangeToken
的OnChange
方法实现原理是利用传入的用于获取IChangeToken
的“producer”获取IChangeToken
,并注册其registerChangeCallback
函数。在该函数内部,先获取新的token
,然后执行传入的“consumer”回调函数,最后再使用新的token
重复这个过程,从而实现持续监测和触发回调。
在.NET Core
中,类似xxxChangeToken
这样的命名方式通常表示实现了IChangeToken
接口的类,它们在各种需要监测数据变化并进行相应处理的场景中得到广泛应用。