26

我正在尝试学习如何使用 Disruptor.NET 消息传递框架,但找不到任何实际示例。那里有很多文章,其中包含有关其工作原理的图片,但是我找不到任何实际去向您展示如何实现这些方法的地方。什么是一个例子?

4

2 回答 2

32

沮丧的是我找不到适用于 Disruptor-net 的可行的“Hello World”,我一直在摆弄直到我找到了一个工作 - 见下文。希望这是不言自明的。这些Console.WriteLine行便于查看事物的运行方式 - 例如,RingBuffer 在启动时创建每个条目实例(这是有道理的)。

希望这可以帮助任何在 .NET 上寻求 Disruptor 帮助的人。

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Disruptor;
using Disruptor.Dsl;

namespace DisruptorTest
{
    public sealed class ValueEntry
    {
        public long Value { get; set; }

        public ValueEntry()
        {
            Console.WriteLine("New ValueEntry created");
        }
    }

    public class ValueAdditionHandler : IEventHandler<ValueEntry>
    {
        public void OnNext(ValueEntry data, long sequence, bool endOfBatch)
        {
            Console.WriteLine("Event handled: Value = {0} (processed event {1}", data.Value, sequence);
        }
    }

    class Program
    {
        private static readonly Random _random = new Random();
        private static readonly int _ringSize = 16;  // Must be multiple of 2

        static void Main(string[] args)
        {
            var disruptor = new Disruptor.Dsl.Disruptor<ValueEntry>(() => new ValueEntry(), _ringSize, TaskScheduler.Default);

            disruptor.HandleEventsWith(new ValueAdditionHandler());

            var ringBuffer = disruptor.Start();

            while (true)
            {
                long sequenceNo = ringBuffer.Next();

                ValueEntry entry = ringBuffer[sequenceNo];

                entry.Value = _random.Next();

                ringBuffer.Publish(sequenceNo);

                Console.WriteLine("Published entry {0}, value {1}", sequenceNo, entry.Value);

                Thread.Sleep(250);
            }
        }
    }
}
于 2012-04-02T16:42:27.443 回答
3

有一篇关于 Disruptor 模式的详细博客文章The Latency Issue。它详细演示了如何开始和使用 Disruptor。

于 2012-11-27T13:12:00.547 回答