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();
}
}