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