????????Disruptor:??其官網定義為:“A High Performance Inter-Thread Messaging Library”,即:線程間的高性能消息框架,與Labview的生產者、消費者模型很相似。
? ? ? ? 其組成部分比較多,先介紹幾個常用的概念:? ? ? ?
1.??Ring Buffer: Disruptor中的數據結構,用于存儲生產者生產的數據。環形的緩沖區。
2.??Producer?即生產者,只是泛指調用?Disruptor?發布事件的對象???
3.??Consumer 消費者。處理事件(數據)的對象。
4. ?Event 事件(數據)從生產者到消費者傳遞的數據叫做Event。
5. ?EventHandler. 事件處理接口,事件(數據發布后) 觸發該事件。
? ? ? ? ringbuffer可以理解成下面的樣子。
一、理論比較復雜,先以一個實際案例感受下:
1. 建立一個ringbuffer,并且指定大小為8; 本窗體為消費者處理窗體
?private static readonly int _ringSize = 8; ? ? ?//定義環大小
?private RingBuffer<PointPair> ringbuffer;? ?//
???var dis = new Disruptor.Dsl.Disruptor<PointPair>(
? ? () => new PointPair(), _ringSize, TaskScheduler.Default);
? ?dis.HandleEventsWith(this);? ? ? //定義本窗體作為事件的處理窗口。
? ?ringbuffer = dis.Start();
2.生產者使用時,在ringbuffer上申請一個序號,把內容填充后,發布(發送出去)
? long seqNo = ringbuffer.Next();? ? //從ringbuffer中申請一個位置(序號)
? PointPair NewPoint = ringbuffer[seqNo];
? NewPoint.X = .....;
? NewPoint.Y = .....); ? ? ? ? ? ? ? ? ? ? ??
? ringbuffer.Publish(seqNo);? ? ? //修改后,進行發布。
3. 有事件過來。消費者進行處理。
?public void OnEvent(PointPair data, long sequence, bool endOfBatch)
?{
? ? ? ? //
}
二、實際案例:
首先,通過Nuget安裝4.0.0.0版本的Disruptor, 以及ZedGraph。最終效果如下(代碼見下鏈接):
Disruptor的使用介紹(一),最簡單的例子資源-CSDN文庫
https://download.csdn.net/download/qq_34047402/90530673
public partial class Form1: Form, IEventHandler<PointPair>{private static readonly int _ringSize = 8;private RingBuffer<PointPair> ringbuffer;PointPairList list1 = new PointPairList();public Form1(){InitializeComponent();var dis = new Disruptor.Dsl.Disruptor<PointPair>(() => new PointPair(), _ringSize, TaskScheduler.Default);dis.HandleEventsWith(this);ringbuffer = dis.Start();createPane(this.zedGraphControl1);Task.Factory.StartNew(() =>{while(true){Thread.Sleep(500);long seqNo = ringbuffer.Next();PointPair NewPoint = ringbuffer[seqNo];NewPoint.X = this.list1[this.list1.Count - 1].X + 1;NewPoint.Y = Math.Sin((double)NewPoint.X * 0.2); ringbuffer.Publish(seqNo);}});//Task.Factory.StartNew(// () =>// {// while (true)// {// Thread.Sleep(500);// long seqNo = ringbuffer.Next();// PointPair NewPoint = ringbuffer[seqNo];// NewPoint.X = this.list1[this.list1.Count - 1].X + 1;// NewPoint.Y =3* Math.Sin((double)NewPoint.X * 0.2);// ringbuffer.Publish(seqNo);// }// }// );}public void OnEvent(PointPair data, long sequence, bool endOfBatch){list1.RemoveAt(0);list1.Add(data);if (this.zedGraphControl1.InvokeRequired){this.zedGraphControl1.Invoke(new Action(delegate{this.zedGraphControl1.AxisChange();this.zedGraphControl1.Refresh();}));}else{this.zedGraphControl1.AxisChange();this.zedGraphControl1.Refresh();}}private void createPane(ZedGraphControl zgc){//得到GraphPane的引用GraphPane myPane = zgc.GraphPane;// 設置標題 myPane.Title.Text = "Disruptor的介紹";myPane.XAxis.Title.Text = "My X Axis";myPane.YAxis.Title.Text = "My Y Axis";//生成正弦函數的數據集合 double x, y1, y2;for (int i = 0; i < 36; i++){x = (double)i ;y1 = Math.Sin((double)i * 0.2);list1.Add(x, y1);}//用鉆石符合形狀生成紅色的曲線和圖例LineItem myCurve = myPane.AddCurve("Porsche",list1, Color.Red, SymbolType.Diamond);//利用圓型的符號生成藍色的曲線和圖例 zgc.AxisChange();}}