国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

由一個訂單推送想到了ObservableCollection的神奇用法

2019-11-17 02:19:52
字體:
來源:轉載
供稿:網友

由一個訂單推送想到了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操作的,這個需要特別注意。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和林格尔县| 民县| 翁源县| 普定县| 昌江| 嘉义市| 荥经县| 团风县| 乐清市| 乌拉特中旗| 大连市| 洪泽县| 逊克县| 上虞市| 浑源县| 贡山| 贺州市| 醴陵市| 怀化市| 郧西县| 汝城县| 玛沁县| 平乐县| 新宾| 湖州市| 鱼台县| 长白| 武清区| 托克托县| 济宁市| 婺源县| 永福县| 会昌县| 双城市| 噶尔县| 蒲江县| 开远市| 中超| 辽中县| 呼玛县| 乌鲁木齐市|