C#如何处理基于数据变化的动态事件?

C# How to handle dynamic events based on Data Change?

提问人:Hussain Murtaza 提问时间:7/11/2023 更新时间:7/11/2023 访问量:25

问:

所以这是我试图解决的一个场景。

假设我有一个包含字符串、键和整数值的字典。

我希望用户在数据更改时订阅特定密钥。我该怎么做?

我正在考虑这样做。

 public class DemoClass : IDisposable
    {
        public Dictionary<string, int> Values = new Dictionary<string, int>();
        public Dictionary<string, EventWrapper> Subs = new Dictionary<string, EventWrapper>();
        public DemoClass()
        {
            Values["A"] = 10;
            Subs["A"] = new EventWrapper();
            Subs["A"].Handler += Handler;
            //Value changed
            Values["A"] = 11;
            //Call Event
            Subs["A"].DoStuff("A");
        }

        private void Handler(string obj)
        {
            Console.WriteLine(obj);
        }

        public void Dispose()
        {
            foreach (var keyValuePair in Subs)
            {
                keyValuePair.Value.Handler -= Handler;
            }
            Subs.Clear();
            Values.Clear();
        }
    }

    public class EventWrapper
    {
        public event Action<string> Handler;
        public void DoStuff(string key)
        {
            Handler?.Invoke(key);
        }
    }

上面的代码跟踪特定键的所有事件,当项目发生更改时,它将调用所有订阅的用户。 现在这会以一种有效的方式吗?这可行,但有没有更好的方法呢?

更多的上下文是每个订阅者都是一个用户,数据在字典中将是 100K,让我们假设每个用户将订阅字典中的许多项目。

C# .NET 事件

评论

0赞 Zohar Peled 7/11/2023
在我看来,您应该使用比您的稍微复杂的类将值包装在数据字典中,并且只有一个字典(私有,而不是公共)。但话又说回来,我不知道你的用例的具体情况。您可能希望改为实现 OR 某种排序。EventWrapperObservableDictionary
0赞 Olivier Jacot-Descombes 7/11/2023
看起来有人已经实现了一个 ObservableDictionary
0赞 Hussain Murtaza 7/11/2023
谢谢你的建议。我会尝试的。
0赞 Zohar Peled 7/11/2023
@OlivierJacot-Descombes 似乎也是一个可靠的实现。但是,我不确定 OP 正在寻找可观察的字典,在我看来,这里的观察部分比收集观察少一点,而项目观察多一点,至少从问题的代码和措辞来看是这样。
0赞 Hussain Murtaza 7/11/2023
让我为您提供更多上下文,因为这将在 Blazor Server 上使用,并且每个用户都将订阅后端端的数据集,因此,如果该特定数据发生更改,则订阅特定密钥的所有用户都将收到通知,并向该用户提供最新数据

答: 暂无答案