MemoryCache.Set 返回删除的缓存项

2024-01-07

我正在使用.NET 4.0MemoryCache http://msdn.microsoft.com/en-us/library/dd780634%28v=vs.100%29.aspx类,并且我想以线程安全的方式添加或替换缓存中的现有项目,但我也想知道我是否替换了现有项目或添加了新项目。

据我所知,Set http://msdn.microsoft.com/en-us/library/ee395903%28v=vs.100%29.aspx方法的目的是原子地替换缓存中的项目(如果存在),而AddOrGetExisting http://msdn.microsoft.com/en-us/library/ee395901%28v=vs.100%29.aspx方法将自动获取现有项目而不替换它。

但是,Set 方法不会返回被替换的项目,而只是替换它。可以将已删除的事件连接到CacheItemPolicy http://msdn.microsoft.com/en-us/library/system.runtime.caching.cacheitempolicy%28v=vs.100%29.aspx的项目,但很难将其与取代它的新项目相匹配。

我可以用下面的方法来近似它,但它看起来有点重(因为要求缓存实质上添加一个项目两次),我想问是否有人知道更简单的方法来做到这一点。

public object SetAndGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null)
{
    lock (_cacheLock)
    {
        var existing = _cache.AddOrGetExisting(key, value, policy, regionName);

        if (existing != null)
        {
            _cache.Set(key, value, policy, regionName);
            return existing;
        }

        return null;
    }
}

想一想,在你的例子中,你无论如何都会更新它,所以AddOrGetExisting正如您提到的,这不是最好的,无论如何您都会稍后再设置。下面是我的一个简单实现think符合你的要求。如果我错了,请告诉我!

public class MemoryCacheWithEvents
{
    private static MemoryCache _cache = new MemoryCache("myCache");
    private static object _syncLock = new object();

    public EventHandler<CacheChangeEventArgs> AddingCacheItem;
    public EventHandler<CacheChangeEventArgs> UpdatingCacheItem;


    public object GetAndSetExisting(string key, object value, CacheItemPolicy policy, string regionName = null)
    {
        lock (_syncLock)
        {
            var cacheItem = new CacheItem(key, value, regionName);

            var existing = _cache.GetCacheItem(key, null);

            if (existing == null)
            {
                OnAddingCacheItem(new CacheChangeEventArgs(null, cacheItem));
            }
            else
            {
                OnUpdatingCacheItem(new CacheChangeEventArgs(existing, cacheItem));   
            }

            _cache.Set(cacheItem, policy);

            return existing;
        }
    }

    public virtual void OnAddingCacheItem(CacheChangeEventArgs eventArgs){
        var handler = AddingCacheItem;

        if (handler != null)
        {
            handler(this, eventArgs);
        }
    }

    public virtual void OnUpdatingCacheItem(CacheChangeEventArgs eventArgs){
        var handler = UpdatingCacheItem;

        if (handler != null)
        {
            handler(this, eventArgs);
        }
    }
}

public class CacheChangeEventArgs : EventArgs
{
    public object OldCacheItem { get; set; }
    public object NewCacheItem { get; set; }

    public CacheChangeEventArgs(object oldCacheItem, object newCacheItem)
    {
        this.OldCacheItem = oldCacheItem;
        this.NewCacheItem = newCacheItem;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MemoryCache.Set 返回删除的缓存项 的相关文章

  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • 假装 .NET 字符串是值类型

    在 NET 中 字符串是不可变的 并且是引用类型变量 这通常会让新的 NET 开发人员感到惊讶 因为他们的行为可能会将它们误认为是值类型对象 然而 除了使用实践StringBuilder对于长连接 尤其是 在循环中 在实践中是否有任何理由需
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • Visual Studio '17 未在参考管理器中显示程序集

    我遇到的问题是 我似乎无法弄清楚如何添加对某些解决方案的引用 在我从 Visual Studio 17 开始的大多数解决方案中 我在解决方案资源管理器中看到 引用 但例如对于 asp net core web api 我得到 依赖项 每当解
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • nuxt.js - 如何在服务器端为所有客户端缓存 axios 调用

    我正在使用 vue nuxt js 应用程序 我想知道是否可以为所有客户端缓存 axios webservice 调用 我必须获取一些货币参考数据 而每个客户都必须调用这些数据并没有多大意义 有人可以给我一些提示 甚至是一个例子吗 谢谢 这
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 在 System.Type 上使用条件断点时出错

    这是函数 public void Init System Type Type this Type Type BuildFieldAttributes BuildDataColumns FieldAttributes 我在第一行设置了一个断点

随机推荐

  • GCC:-static 和 -pie 与 x86 不兼容?

    我正在为 Android 5 0 重新编译一些可执行文件 因为它需要可执行文件PIE 我能够重新编译它ARM只需在配置时添加一些参数 使用独立工具链 export CFLAGS I softdev arm libs include fPIE
  • 使用数组条件跳出循环

    我目前正在为课堂制作一个滑道和梯子游戏 这场比赛的获胜条件是如果玩家落在 Square 100 上 他们就获胜 如果他们碰巧超过了 100 他们会一直呆在那里 直到每个人都完成游戏 要么有人达到 100 要么每个人都超过 100 如果每个人
  • 如何同步从LiveData获取值?

    For LiveData 有没有类似的东西blockingNext or blockingSingle在RxJava的Observable中同步获取值 如果没有 我怎样才能实现相同的行为 您可以致电getValue 返回当前值 如果有 但是
  • 为什么人们仍然在 Java 中使用原始类型?

    从 Java 5 开始 我们对原始类型进行了装箱 拆箱 以便int被包裹成java lang Integer 等等 我最近看到了很多新的 Java 项目 确实需要至少版本 5 如果不是 6 的 JREint而不是java lang Inte
  • 在 C++ 中用函数调用替换强制转换

    有关重构 替换强制转换的工具或方法的任何建议 例如 type data into convert to type data 当事情变得更加棘手时data其中有更高优先级的运算符 括号或换行符 type a b gt c 应该成为conver
  • Cucumber和Spring boot集成出现错误

    Spring boot和cucumber集成 当我将该项目打包为jar时 使用mvn package命令并生成advvic 1 0 jar 但是 如果我运行这个罐子 java jar target advvic 1 0 jar 我收到此错误
  • 为什么 DataTemplate.LoadContent() 不尊重模板定义的触发器?

    TL DR版本 我们试图找出触发器有效时自动应用 DataTemplate 与触发器无效时手动调用 DataTemplate LoadContent 之间的区别 现在细节 但首先 我首先要说的是 这个问题是为了帮助我们理解框架以及它内部在做
  • C# 正则表达式电话号码检查

    我有以下内容来检查电话号码是否采用以下格式 XXX XXX XXXX 下面的代码始终返回 true 不知道为什么 Match match Regex Match input d 3 d 3 d 3 d 4 Below code always
  • 在 django 中运行“syncdb”时如何指定模式名称?

    假设我有一个名为 my schema 的模式 如何为该特定模式创建带有 djangosyncdb 的表 或者还有其他选择可以从我的 django 模型快速创建表吗 我认为 默认情况下 django 为 公共 模式创建表 首先 您必须拥有 p
  • 无需打开表单即可获取表单记录源

    MS Access 是否允许在不打开表单本身的情况下获取表单的记录源值 我现在正在尝试优化我的代码 我所做的只是隐藏表单 然后获取 Recordsource 表单查询 但加载需要时间 因为某些表单在加载时会触发代码 我在这里玩游戏迟到了 我
  • 对于嵌套模板,“>>”何时成为标准 C++(而不是“> >”)?

    我似乎记得 以前 有人警告不要放两个 gt 处理嵌套模板参数时 字符彼此相邻 没有空格 我什至依稀记得声明任何向量的向量并遇到此编译错误 但现在我发现编译可怕的东西绝对没有错 gt gt 我的问题是 这个惯例在什么时候成为可以接受的做法 它
  • Postgresql 中的 Postgresql 全文搜索 - 日语、中文、阿拉伯语

    我正在为我当前的项目设计一个 postgresql 全文搜索功能 到目前为止 它可以与 ispell myspell 词典配合使用 现在我需要添加对中文 日文和阿拉伯文搜索的支持 我从哪说起呢 没有适用于这些语言的模板或词典 据我所知 它可
  • SQL - 将单列划分为多列

    我有以下 SQL 问题 如何使用 SELECT 命令将列 内部文本 分成两个带有分割文本的单独列 我需要使用空格字符分隔文本数据 我知道最好举个例子来让它变得容易 所以 SELECT COLUMN A FROM TABLE1 output
  • 清理AjaxToolkit AsyncFileUpload控件

    我在我的 aspx net 页面中使用 AsyncFileUpload 控件 该控件在更新面板内运行 我可以成功地将文件异步上传到服务器 我的问题是 每个文件上传后我无法刷新整个页面 所以我需要弄清楚如何清除上次上传的文件 这样当用户选择新
  • 了解多处理:Python 中的共享内存管理、锁和队列

    多重处理 https docs python org 2 library multiprocessing html module multiprocessingpython中的一个强大的工具 我想更深入地了解它 我想知道什么时候使用regu
  • 奇怪的 JavaScript 性能依赖于变量范围

    在测试一个 JavaScript 项目的性能时 我注意到一种非常奇怪的行为 JavaScript 成员访问性能似乎很大程度上受到它们所在范围的影响 我编写了一些性能测试 结果因多个数量级 我在 Windows 10 64 位上使用以下浏览器
  • 全局点击事件处理程序(WithEvents)

    我正在尝试创建一个类模块 当有人单击我表单中的六十个文本框之一时 它将充当全局处理程序 文本框代表一周的时间卡 显示一周 7 天的上班时间 下班时间 午餐开始 结束 持续时间 每日总小时数等信息 当有人单击一天中的任何一个框时 所有框都会解
  • Angular2 如何在 HTML5 模板中显示 localStorage 值?

    我在 localStorage 中存储 2 个密钥 我想在我的模板中显示其中之一 我无法访问这些值 我什至创建了一个接口来存储 localStorage 中的 currentUser 键的值 应该如何实施呢 这是当前的代码 Service
  • stl::list 中的 C++ 接口

    课程界面 class ILesson public virtual void PrintLessonName 0 virtual ILesson STL容器 typedef list
  • MemoryCache.Set 返回删除的缓存项

    我正在使用 NET 4 0MemoryCache http msdn microsoft com en us library dd780634 28v vs 100 29 aspx类 并且我想以线程安全的方式添加或替换缓存中的现有项目 但我