程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 由一個訂單推送想到了ObservableCollection的神奇用法,observablecollection

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

編輯:C#入門知識

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


    

     最近在做taobao的一個賣家應用,需要訂閱taobao的訂單推送,示例代碼如下:

 

一:先看玩法

  首先我對集合進行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操作的,這個需要特別注意。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved