.NET】聊聊 IChangeToken 接口

简介: 【7月更文挑战第2天】‘IChangeToken`接口在.NET Core中用于提供变更通知服务,包括`hasChanged`属性来检查是否已变更,`activeChangeCallbacks`属性确认是否执行回调,以及`registerChangeCallback`方法用于注册变更时执行的回调函数。示例代码展示了如何监视文件变化并响应。`ChangeToken.OnChange`方法允许持续监控并每次变更时触发回调。`IChangeToken`和相关实现广泛用于监听配置变化或其他动态数据更新的场景。

IChangeToken接口主要用于提供更改通知。它定义了以下成员:


  • hasChanged:只读属性,用于指示当前的IChangeToken是否已发生变化。如果数据发生变化,该属性将变为true
  • activeChangeCallbacks:只读属性,用于表示当数据发生变化时,是否主动执行注册的回调函数。通常该值设置为true,如果设置为false,则不会调用回调。
  • registerChangeCallback(Action<object> callback, object state):该方法用于注册一个当数据发生变化时自动执行的回调函数。它接受一个Action<object>类型的回调函数和一个可选的object类型的状态参数。注册成功后会返回一个IDisposable对象,可使用其Dispose方法解除注册的回调函数。


在实际使用中,并不需要自己实现IChangeToken接口,框架中已经有现成的实现。例如,在文件系统中,PhysicalFileProviderwatch方法在监测到文件变化时会返回一个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); 
}


在上述代码中,通过PhysicalFileProviderwatch方法获取一个IChangeToken,然后注册一个回调函数。当文件发生变化时,回调函数将被执行。


然而,这样得到的IChangeToken通常具有“一次性”的特征,即使用一次后就会失效。如果想要持续监测变化并每次都触发回调,可以使用ChangeToken类的OnChange方法。ChangeToken是一个静态类,它提供了OnChange方法用于注册回调。


例如:


收起


csharp

复制

ChangeToken.OnChange(() => fileProvider.Watch("test.txt"), () => Console.WriteLine("file changed!", ConsoleColor.DarkGreen));


这样,每次文件发生变化时,都会自动执行传入的回调函数。


ChangeTokenOnChange方法实现原理是利用传入的用于获取IChangeToken的“producer”获取IChangeToken,并注册其registerChangeCallback函数。在该函数内部,先获取新的token,然后执行传入的“consumer”回调函数,最后再使用新的token重复这个过程,从而实现持续监测和触发回调。


.NET Core中,类似xxxChangeToken这样的命名方式通常表示实现了IChangeToken接口的类,它们在各种需要监测数据变化并进行相应处理的场景中得到广泛应用。

相关文章
|
XML 数据可视化 程序员
(一).NET Core WebAPI集成Swagger做接口管理
什么是Swagger? Swagger 是一个规范且完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 Swagger 的目标是对 REST API 定义一个标准且和语言无关的接口,可以让人和计算机拥有无须访问源码、文档或网络流量监测就可以发现和理解服务的能力。当通过 Swagger 进行正确定义,用户可以理解远程服务并使用最少实现逻辑与远程服务进行交互。与为底层编程所实现的接口类似,Swagger 消除了调用服务时可能会有的猜测。 Swagger 有什么优势? 支持 API 自动生成同步的在线文档:使用 Swagger 后可以直接通过代码生成文档,不再需
(一).NET Core WebAPI集成Swagger做接口管理
|
7月前
|
开发框架 .NET 中间件
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (2)第七天Blazor班级管理页面编写和接口对接
149 7
|
4月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
七天.NET 8操作SQLite入门到实战 - (3)第七天Blazor学生管理页面编写和接口对接
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
49 0
|
7月前
|
XML API 数据库
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
129 0
|
7月前
|
JSON JavaScript 前端开发
全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解
全面的.NET微信网页开发之JS-SDK使用步骤、配置信息和接口请求签名生成详解
|
对象存储
.net core 阿里云接口之拷贝文件
紧接上文, 1)[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.12873639.article-detail.7.2b0e5b1cpeWbZ5 ".net core 阿里云接口之获取临时访问凭证") 2)[.net core 阿里云接口之将指定的OSS文件下载到流](https://developer.aliyun.com/article/1363886 ".net core 阿里云接口之将指定的OSS文件下载到流") 本文继续阿里云接口调用,将指定的OSS文件下载到流。
69 0
|
C# 对象存储
.net core 阿里云接口之将指定的OSS文件下载到流
紧接上文,[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.13262185.profile.8.180876540j71A9 ".net core 阿里云接口之获取临时访问凭证") 本文继续阿里云接口调用,将指定的OSS文件下载到流。 直接上代码: ```csharp /// <summary> /// 将指定的OSS文件下载到流 /// </summary> /// <param name="args"></param> /// <returns></returns> [H
284 0
|
对象存储 数据安全/隐私保护 开发者
.net core 阿里云接口之获取临时访问凭证
假设您是一个移动App开发者,希望使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离。此时,您可以使用STS授权用户直接访问OSS。 使用STS授权用户直接访问OSS的流程如下: ![image.png](https://ucc.alicdn.com/pic/developer-ecology/j2ygdazy447va_7d767aa1db4047778a7b5c568b5d7c11.png) ## 1、关于秘钥等信息的申请见如下链接 [使用STS临时访问凭证访问OSS](https://help.aliyun.com/zh/oss/developer
206 0
|
SQL 网络安全
外网访问接口,报net::ERR_CONNECTION_REST错误。
外网访问接口,报net::ERR_CONNECTION_REST错误。
226 0