最近在做taobao的一個賣家應用,需要訂閱taobao的訂單推送,示例代碼如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNlRjM4EjZ4ETYmRDN1QTMmZGOyUjZykDMzUDO5MWM58CXzAzLclDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL1M3Lc9CX6MHc0RHaiojIsJye.png)
看到上面的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,是不是很開心。。。。
下面跟着我一起去看看