由一个订单推送想到了ObservableCollection的神奇用法

2024-08-29 23:32

本文主要是介绍由一个订单推送想到了ObservableCollection的神奇用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在做taobao的一个卖家应用,需要订阅taobao的订单推送,示例代码如下:

 

 

看到上面的OnMessage场景之后,我突然就鬼使神差的在想最近写的一个服务,其中的一个功能是需要定时的轮询一个集合,这样可以方便的把数据取出来,但是

轮训对我来说是被迫的,我急迫需要一种机制对一个集合的数据进行监控,比如List,Dictionary等等,这样我就很方便的对数据进行后续处理,而不是我定时的去轮

训一个集合,然后我就想到了wpf里面有一个玩法叫做“属性依赖”,然后就想到了今天要说的“ObservableCollection”集合,下面我们就来看看这个集合的玩法。

 

一:先看玩法

  首先我对集合进行Add和Remove操作,并且给他注册个change事件,然后用工作线程去执行change事件的逻辑,看看给我什么反馈,神奇的效果即刻开始。

复制代码
 class Program{static void Main(string[] args){ObservableCollection<string> list = new ObservableCollection<string>() { "1" };list.CollectionChanged += list_CollectionChanged;for (int i = 0; i < 1000; i++){if (i % 3 == 1){list.RemoveAt(0);}else{list.Add(i.ToString());}}Console.WriteLine("全部结束!!!");Console.Read();}static void list_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e){//为了不阻止主线程Add,事件用 “工作线程”处理Task.Factory.StartNew((o) =>{var obj = o as NotifyCollectionChangedEventArgs;switch (obj.Action){case NotifyCollectionChangedAction.Add:Console.WriteLine("当前线程:{0}, 操作是:{1} 数据:{2}", Thread.CurrentThread.ManagedThreadId, obj.Action.ToString(), obj.NewItems[0]);break;case NotifyCollectionChangedAction.Move:break;case NotifyCollectionChangedAction.Remove:Console.WriteLine("当前线程:{0}, 操作是:{1} 数据:{2}", Thread.CurrentThread.ManagedThreadId, obj.Action.ToString(), obj.OldItems[0]);break;case NotifyCollectionChangedAction.Replace:break;case NotifyCollectionChangedAction.Reset:break;default:break;}Thread.Sleep(1000);}, e);}}
复制代码

 

     从表象来看,CollectionChanged 已经完全的监控到了集合的各个动作,包括Add,Remove,很显然,这比我去轮训数据好多了,不过用的话,谁都会用,

关键是要看看怎么实现的,下面我们来剖析下。

 

二:简单分析下源码

  首先我们会发现,ObservableCollection继承了一个Collection并且实现了一个“属性通知”和“集合通知”的两个接口INotifyCollectionChanged,

 INotifyPropertyChanged)。

 

然后我们发现Add方法是由父类提供,然后调用ObservableCollection中提供了InsertItem方法,如下图。

 

 

可以看到,在我们上层的Add方法中,其实调用的是InsertItem方法,并且在最后我们看到了一个核心方法OnCollectionChanged,是不是很开心。。。。

下面跟着我一起去看看

 

最终我们开心的看到了这个类的触发机制,只不过是在Add/Remove方法的最后面做了一个事件触发的方法,同时我们也看到了,这是一个同步操作,这就意味着,

默认情况下,我的CollectionChanged逻辑是会阻止上层的Add操作的,这个需要特别注意。

这篇关于由一个订单推送想到了ObservableCollection的神奇用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1119157

相关文章

JavaScript中的Map用法完全指南

《JavaScript中的Map用法完全指南》:本文主要介绍JavaScript中Map用法的相关资料,通过实例讲解了Map的创建、常用方法和迭代方式,还探讨了Map与对象的区别,并通过一个例子展... 目录引言1. 创建 Map2. Map 和对象的对比3. Map 的常用方法3.1 set(key, v

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php