浅析C#更改令牌ChangeToken

浅析C#更改令牌ChangeToken

什么是ChangeToken

ChangeToken是ASP.NET Core框架中的一个关键抽象,是用来告诉缓存或联接等系统何时应该使其存储的数据过期并重新生成的一种机制。它可以被用于许多场景,例如:文件缓存、分布式缓存、Razor导航等等。

ChangeToken以观察者模式的方式工作,即我们的应用程序会订阅一个ChangeToken,一旦变更发生,就会通知我们。同时,ChangeToken也可以用于取消订阅,以防止对象没有及时地销毁。

ChangeToken的使用

添加ChangeToken

假设我们有一个缓存系统,通过获取一个API的数据并将其存储在内存中以支持快速查询。为了最大限度地利用缓存,我们可以使用ChangeToken机制,在数据发生变化时使缓存过期并重新生成。

在ASP.NET Core中,我们可以使用MemoryCache,它是一个内存中的缓存系统。

// 新建MemoryCache实例
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
// 获取一个ChangeToken依赖项(假设是API数据)
var apiDependency = new CancellationChangeToken(new CancellationTokenSource().Token);
// 添加缓存
cache.Set("api_data", GetApiData(), new MemoryCacheEntryOptions()
{
    AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10),
    SlidingExpiration = TimeSpan.FromSeconds(5),
    // 将ChangeToken依赖项绑定到缓存中
    ExpirationTokens = { apiDependency }
});
// 订阅ChangeToken的变更通知
apiDependency.RegisterChangeCallback(state =>
{
    // 当变更通知到达后,清空缓存
    cache.Remove("api_data");
}, null);

在上面的代码示例中,我们通过MemoryCache实例添加了一个缓存,缓存中的数据依赖于GetApiData()方法返回的API数据,并且在这个数据发生变化时缓存将过期并重新生成。这是通过将一个ChangeToken依赖项绑定到缓存中来实现的,当变更通知到达时,我们会将缓存从MemoryCache中删除。同时,我们也订阅了这个ChangeToken,以便在变更通知到达时能够及时更新缓存。

取消ChangeToken

还可以通过CancellationTokenSource.Cancel()方法来取消ChangeToken的订阅,这可以方便我们在对象没有及时销毁时进行操作。

IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
var apiDependency = new CancellationChangeToken(new CancellationTokenSource().Token);

// ...

// 取消ChangeToken订阅
cancellationTokenSource.Cancel();

示例

示例1:在API数据更改时过期缓存

在这个示例中,我们模拟了一个获取API数据的方法,并将其存储在MemoryCache缓存中。我们使用了ChangeToken机制来在API数据发生更改时使缓存过期,并重新生成。

IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

public IActionResult GetApiData()
{
    // 新建一个ChangeToken依赖项
    var apiDependency = new CancellationChangeToken(new CancellationTokenSource().Token);

    // 添加缓存
    cache.Set("api_data", GenerateData(), new MemoryCacheEntryOptions()
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10),
        SlidingExpiration = TimeSpan.FromSeconds(5),
        ExpirationTokens = { apiDependency }
    });

    // 订阅ChangeToken的变更通知
    apiDependency.RegisterChangeCallback(state =>
    {
        // 当API数据发生更改时,通知MemoryCache中“api_data”缓存过期
        cache.Remove("api_data");
    }, null);

    // 返回MemoryCache中的数据
    var data = cache.Get<string>("api_data");
    return Ok(data);
}

public IActionResult UpdateApiData()
{
    // 模拟API数据的更新操作
    UpdateData();

    // 当API数据更新时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

private string GenerateData()
{
    return "API Data " + DateTime.Now.ToString();
}

private void UpdateData(){
    // 省略更新操作
}

示例2:在数据库操作时过期缓存

在这个示例中,我们模拟了一个使用Entity Framework Core进行数据读取的操作,并将其存储在MemoryCache缓存中。我们使用ChangeToken机制在数据库中进行插入/更新/删除操作时使缓存过期,并重新生成。

IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());

public IActionResult GetUserData(int userId)
{
    // 新建一个ChangeToken依赖项
    var dbDependency = new ChangeToken();

    // 从数据库获取数据,并添加到缓存中
    var data = _dbContext.Users.Find(userId);
    cache.Set($"user_{userId}", data, new MemoryCacheEntryOptions()
    {
        AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(10),
        SlidingExpiration = TimeSpan.FromSeconds(5),
        ExpirationTokens = { dbDependency }
    });

    // 订阅ChangeToken的变更通知
    dbDependency.RegisterChangeCallback(state =>
    {
        // 当数据变更时,通知MemoryCache中的缓存过期
        cache.Remove($"user_{userId}");
    }, null);

    // 返回MemoryCache中的数据
    var userData = cache.Get<User>($"user_{userId}");
    return Ok(userData);
}

public IActionResult AddUser(User user)
{
    _dbContext.Users.Add(user);
    _dbContext.SaveChanges();

    // 当在数据库中插入新数据时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

public IActionResult UpdateUser(User user)
{
    _dbContext.Users.Update(user);
    _dbContext.SaveChanges();

    // 当在数据库中更新数据时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

public IActionResult DeleteUser(int userId)
{
    var user = _dbContext.Users.Find(userId);
    _dbContext.Users.Remove(user);
    _dbContext.SaveChanges();

    // 当在数据库中删除数据时,取消之前的ChangeToken订阅
    cancellationTokenSource.Cancel();

    return Ok();
}

以上两个示例演示了ChangeToken的使用方式,可以根据实际场景进行相应的调整和变化。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析C#更改令牌ChangeToken - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • 手动编译C#代码的方法

    手动编译C#代码的方法,需要使用命令行工具,步骤如下: 安装.NET SDK首先需要安装.NET SDK,该工具包含了C#编译器和其他需要的组件,可以在https://dotnet.microsoft.com/download中下载。 编写C#代码创建一个.cs文件,并使用C#编写代码,例如下面这段简单的代码: using System; namespace…

    C# 2023年5月14日
    00
  • c#判断网络连接状态

    下面是“c#判断网络连接状态”的完整攻略 检测网络连接状态 在 C# 中检测网络连接状态,可以通过检查本机与 Internet 之间是否能够互相访问来实现。 实现该功能,可以通过以下几步完成: 第一步:引入命名空间 在代码文件的顶部,引入 System.Net.NetworkInformation 命名空间。该命名空间包含用于检测网络状态的类。 using …

    C# 2023年5月15日
    00
  • C# Windows API应用之基于GetDesktopWindow获得桌面所有窗口句柄的方法

    首先,我们需要了解Windows API及C#中如何调用Windows API。Windows API是Windows操作系统提供给开发者的一组函数,通过这些函数我们可以访问Windows系统的各种资源。在C#中,我们可以使用[DllImport]特性来调用Windows API中的函数。 在本篇攻略中,我们将介绍如何使用GetDesktopWindow函数…

    C# 2023年6月7日
    00
  • 在C#中对TCP客户端的状态封装详解

    对TCP客户端的状态进行封装,可以提高代码的可维护性和可读性,方便后期的代码扩展和优化。在C#中,可以使用枚举类型和委托来实现对TCP客户端的状态封装。 1、枚举类型实现TCP客户端状态封装 使用枚举类型可以定义TCP客户端的连接状态、发送状态、接收状态等,用于标识TCP客户端当前所处的状态,同时可用于状态转换的判断。示例代码如下: public enum …

    C# 2023年5月15日
    00
  • C#多线程系列之工作流实现

    C#多线程系列之工作流实现 在使用C#开发多线程应用时,需要考虑线程间的通信、锁定、线程池等诸多因素。而将这些因素整合成“工作流”则是一个不错的选择。本篇文章将为大家介绍如何使用工作流实现多线程编程。 工作流概念 工作流是一种基于人工业务过程流程的自动化技术,常用于业务流程管理、流程模拟、调度执行等领域。在C#多线程编程中,我们将线程视作工作流程中的具体实现…

    C# 2023年6月6日
    00
  • C#中字符串优化String.Intern、IsInterned详解

    C#中字符串优化String.Intern、IsInterned详解 什么是字符串优化 在 C# 中,字符串是不可变类型,每次对字符串进行操作时都会产生新的字符串对象。这就意味着如果我们频繁地对字符串进行操作,就会造成很多对象的额外开销。所以为了减少这种开销,我们需要对字符串进行优化。 字符串优化的方法有很多,其中一种方法是使用 String.Intern …

    C# 2023年5月31日
    00
  • asp.net 截取字符串代码

    ASP.NET 截取字符串有多种方法,以下是两种示例代码: 使用 Substring() 方法截取字符串 Substring() 方法可以用于截取一个字符串的一部分,该方法接受两个参数:第一个参数是截取字符串的起点位置,第二个参数是截取字符串的长度。以下是使用 Substring() 方法截取字符串的示例代码: string originalString =…

    C# 2023年5月31日
    00
  • C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    C#实现WebSocket协议客户端和服务器websocketsharp组件实例解析 WebSocket是一种在单个TCP连接上进行全双工通信的协议,它可以在客户端和服务器之间进行实时数据交换。WebSocket协议支持使用HTTP协议作为握手协议建立连接,随后进行数据传输。 websocketsharp是一种C# WebSocket客户端和服务器实现,它提…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部