面试官:实现一个带值变更通知能力的Dictionary

news/2024/5/19 1:38:09 标签: sms, wpf, 3d, c3p0, jdbc

如题, 你知道字典KEY对应的Value什么时候被覆盖了吗?

最近大家都在追.Net6 update,咱还是保持节奏,通用语言聊技术。

没背景说个铲铲

       上文中 数据获取组件维护了业务方所有(在用)的连接对象,DBA能在后台无侵入的切换备份库。

如何主动清空.NET数据库连接池?

上文中:DBA在为某个配置字符串切换新的连接信息时,SDK利用ClearPool(DBConnection conn)方法清空与这个连接相关的连接池。

清空的时机:维护在用连接的字典键值发生变更。

今天本文就来实现一个带值变更通知能力的字典

五毛钱的编程实践

关键字:变更 通知 字典

using System;
using System.Collections.Generic;
using System.Text;
namespace DAL
{
    public class ValueChangedEventArgs<TK> : EventArgs
    {
        public TK Key { get; set; }
        public ValueChangedEventArgs(TK key)
        {
            Key = key;
        }
    }

    public class DictionaryWapper<TKey, TValue>
    {
        public object  objLock = new object();
       
        private Dictionary<TKey, TValue> _dict;
        public event EventHandler<ValueChangedEventArgs<TKey>> OnValueChanged;
        public DictionaryWapper(Dictionary<TKey, TValue> dict)
        {
            _dict = dict;
        }
        public TValue this[TKey Key]
        {
            get { return _dict[Key]; }
            set
            {
                lock(objLock)
                {
                    try
                    {
                        if (_dict.ContainsKey(Key) && _dict[Key] != null && !_dict[Key].Equals(value))
                        {
                            OnValueChanged(this, new ValueChangedEventArgs<TKey>(Key));
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"检测值变更或者触发值变更事件,发生未知异常{ex}");
                    }
                    finally
                    {
                        _dict[Key] = value;
                    }
                }
            }
        }
    }
}

旁白:

1.定义值变更事件OnValueChanged 和变更时传递的事件参数ValueChangedEventArgs<TKey>2.如何定义值变更,也就是如何判定值类型、引用类型的相等性          #equalhashcode#3.DictionaryWapper的表征实现也得益于C#索引器特性


订阅值变更事件

var _dictionaryWapper = new DictionaryWapper<string, string>(new Dictionary<string, string> { });
_dictionaryWapper.OnValueChanged += new EventHandler<ValueChangedEventArgs<string>>(OnConfigUsedChanged);
//----
public static void OnConfigUsedChanged(object sender, ValueChangedEventArgs<string> e)
{
   Console.WriteLine($"字典KEY:{e.Key}的值发生了变更,请注意...");          
}

最后像正常Dictionary一样为DictionaryWapper添加键值对:

 _dictionaryWapper[$"{dbConfig}:{connectionConfig.Provider}"] = connection.ConnectionString;

五毛钱的结尾语

OK,本文实现了一个带值变更通知能力的字典,算是一个刚性需求。

通过本文,重温了C# event 、索引器的用法,基础不牢,地动山摇。

3d5b3b0a71e9eabd3.gif" />

 性感豹纹

  三分钟掌握共享内存 & Actor并发模型

 3dc19010b7e5ed55eb3b3175bae494de9834cf3760e2701&idx=1&mid=2247487441&scene=21&sn=e7fcbae00fd9df38319cb589ecd62a4f#wechat_redirect">如何主动清空.NET数据库连接池?

 鹅厂二面,Nginx回忆录3d915e6df6#wechat_redirect">

 Redis分布式锁抽丝剥茧

 看过这么多爆文,依旧走不好异步编程这条路?

 谁说docker-compose不能水平扩展容器、服务多实例?

3d74745.gif" />

 Kubernetes探针踩坑记

 难缠的布隆过滤器,这次终于通透了

由于微信公众号修改了推送规则,为便于大家及时收到我的不定时推送,加星标、一键三连互动、加好友(hihuangjun),不失为良策,就酱!


http://www.niftyadmin.cn/n/1864479.html

相关文章

ASP.NET Core端点路由中三种让人困惑的路由函数

早先提及了端点路由app.UseEndpoints, 端点路由强调的是端点和路由&#xff0c;其核心目的是将请求落地点与路由寻址方式解耦。《ASP.NET Core端点路由作用原理》这里面有几个容易混淆的函数•MapControllerRoute•MapDefaultControllerRoute•MapControllers有什么不同&#x…

再聊一次值类型和引用类型

C#值类型&#xff0c;作为函数形参&#xff0c;形参被修改&#xff0c;不影响原值。这是我们在初始学习编程时需要记住的内容&#xff0c;我们也是一直这样践行的。先说结论&#xff1a;这是不准确的。为什么提出这样看似很浅显的问题&#xff0c;是因为有次我在使用ArraySegme…

面试官: 平时开发中你用过读写锁吗?

前面实现了一个 带值变更通知能力的字典类(线程不安全)&#xff0c;童鞋们有没有发现演示代码使用了 lock语法糖&#xff0c; 这个有没有问题呢&#xff1f;没背景说个铲铲同程艺龙基础架构部推出的数据获取组件DAL.Connection&#xff0c;我们要做到在切换连接配置时清空数据库…

多线程环境下,程序真是危机四伏

姿势在不断的更新迭代&#xff0c; 太卷了。你管这也叫线程安全&#xff1f;最近大意了&#xff0c;竟然想将《面试官&#xff1a;实现一个带值变更通知能力的Dictionary》一文中的临界锁只应用到写操作。内心旁白&#xff1a;读操作又不会修改数据&#xff0c;无论是新值还是旧…

JMeter压测笔记

每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。Jmeter 是一款使用Java开发的&#xff0c;开源免费的&#xff0c;测试工具&#…

大前端快闪:package.json文件知多少?

最近在公司某项目参与了一些前端工作&#xff0c;作为后端抠脚大汉&#xff0c;改点前端细节磕磕绊绊&#xff0c;改点大前端、工程化、HTTP交互倒也还能做到柳暗花明。于是打算用后端程序猿的视角记录一些{大前端}的知识快闪&#xff0c;也算是帮助读者构建完整的全栈技能体系…

大前端快闪二:react开发模式 一键启动多个服务

最近全权负责了一个前后端分离的web项目&#xff0c;前端使用create-react-app[1], 后端使用golang做的api服务。npx create-react-app my-app cd my-app npm start歘歘歘&#xff0c;就搭建了一个react前端项目。前端老鸟都知道npm start或yarn start以开发模式启动react App&…

前端快闪三:多环境灵活配置react

大前端快闪&#xff1a;package.json文件知多少&#xff1f;大前端快闪二&#xff1a;react开发模式 一键启动多个服务你已经使用Create React App[1] 脚手架搭建了React应用&#xff0c;现在该部署了。一般会使用npm run build或者yarn build构建出静态资源&#xff0c; 由web…