上面代码首先创建了一个CancellationTokenSource对象,并将其设置成名为“cts”的缓存项。然后创建MemoryCacheEntryOptions对象,并使用AddExpirationToken()方法指定一个特殊的过期令牌(expiration token),这里我们暂不深究CancellationChangeToken。
expiration token允许你“过期”一个缓存项,如果令牌是“active”状态则保留缓存项,如果是“cancelled”则从缓存中移除。一旦缓存项被移除则调用MyCallback方法。代码接着创建了两个缓存项 key1和key2,创建时第三参数传递了一个使用cts对象初始化的CancellationChangeToken。
现在我们有了三个缓存项,timestamp是主缓存项,key1和key2依赖与timestamp。当timestamp被移除时,会同时移除key1和key2。移除timestamp需要取消它的令牌。
public IActionResult Remove()
{
CancellationTokenSource cts = cache.Get<CancellationTokenSource>("cts");
cts.Cancel();
return RedirectToAction("Show");
}
我们从缓存中获得先前定义的CancellationTokenSource对象同时执行Cancel()方法,timestamp移除的同时key1与key2也一并移除了。
测试一下上面代码,运行程序并访问/Home/Index页面,再访问/Home/Show页面,同时检查三个缓存项是否按预期显示。然后访问/Home/Remove,你将重新被导航到/Home/Show页面。当Remove() action被调用时,令牌被标记为取消,所有的值将被移除。Show页面将显示过期原因为“令牌过期”: