您的位置:首页 > 健康 > 美食 > web制作网页盒子_天眼查企业查询公司_百度竞价推广常用到的工具_郑州做网络营销渠道

web制作网页盒子_天眼查企业查询公司_百度竞价推广常用到的工具_郑州做网络营销渠道

2025/3/31 21:08:17 来源:https://blog.csdn.net/qq_34047402/article/details/146508645  浏览:    关键词:web制作网页盒子_天眼查企业查询公司_百度竞价推广常用到的工具_郑州做网络营销渠道
web制作网页盒子_天眼查企业查询公司_百度竞价推广常用到的工具_郑州做网络营销渠道

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com