Exemple #1
0
        public void EventConsumer()
        {
            var l  = new object[_ring.BufferSize];
            var t  = new TaskCompletionSource <bool> [_ring.BufferSize];
            var lw = new ReadOnlyListArrayWrapper <object>(l);

            var nextSequence = _sequence.Value + 1L;

            while (true)
            {
                try
                {
                    var availableSequence = _sequenceBarrier.WaitFor(nextSequence);
                    var count             = 0;
                    while (nextSequence <= availableSequence)
                    {
                        var evt = _ring[nextSequence];
                        l[count] = evt.Event;
                        t[count] = evt.TaskCompletionSource;
                        count++;
                        nextSequence++;
                    }
                    if (count == 0)
                    {
                        continue;
                    }
                    lw.Count = count;
                    _writeStore.Store(null, lw);
                    for (var i = 0; i < count; i++)
                    {
                        Task.Factory.StartNew(o => ((TaskCompletionSource <bool>)o).SetResult(true), t[i], CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
                        t[i] = null;
                        l[i] = null;
                    }
                    _sequence.LazySet(nextSequence - 1L);
                }
                catch (AlertException)
                {
                    break;
                }
            }
        }
        public void EventConsumer()
        {
            var l = new object[_ring.BufferSize];
            var t = new TaskCompletionSource<bool>[_ring.BufferSize];
            var lw = new ReadOnlyListArrayWrapper<object>(l);

            var nextSequence = _sequence.Value + 1L;
            while (true)
            {
                try
                {
                    var availableSequence = _sequenceBarrier.WaitFor(nextSequence);
                    var count = 0;
                    while (nextSequence <= availableSequence)
                    {
                        var evt = _ring[nextSequence];
                        l[count] = evt.Event;
                        t[count] = evt.TaskCompletionSource;
                        count++;
                        nextSequence++;
                    }
                    if (count == 0)
                    {
                        continue;
                    }
                    lw.Count = count;
                    _writeStore.Store(null, lw);
                    for (var i = 0; i < count; i++)
                    {
                        Task.Factory.StartNew(o => ((TaskCompletionSource<bool>)o).SetResult(true), t[i], CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
                        t[i] = null;
                        l[i] = null;
                    }
                    _sequence.LazySet(nextSequence - 1L);
                }
                catch (AlertException)
                {
                    break;
                }
            }
        }