/// <summary> /// Waits for a pending connection, if any, then pauses the task. /// </summary> /// <returns></returns> public async ValueTask PauseAsync() { ThrowIfDisposed(); if (_pausing) { throw new InvalidOperationException("Already paused."); } _pausing = true; _addresses.TryWrite(null); // force receive await _paused.WaitAsync().CfAwait(); }
public async Task StressTest() { var queue = new AsyncQueue <int>(); var list = new List <int>(); var task = Task.Run(async() => { await foreach (var i in queue) { list.Add(i); } }); var writerCount = 10; var writers = new Task[writerCount]; var indexes = new int[writerCount]; var writing = true; var paused = false; for (var i = 0; i < writerCount; i++) { var n = i; writers[n] = Task.Run(async() => { while (writing) { if (!paused && queue.TryWrite(indexes[n])) { indexes[n]++; } await Task.Delay(RandomProvider.Random.Next(100)); } }); } await Task.Delay(2000); paused = true; await Task.Delay(1000); paused = false; await Task.Delay(2000); writing = false; queue.Complete(); await task; await Task.WhenAll(writers); var total = 0; for (var i = 0; i < writerCount; i++) { Console.WriteLine($"{i}: {indexes[i]}"); total += indexes[i]; } Assert.That(list.Count, Is.EqualTo(total)); }
public async Task WriteThenRead() { var queue = new AsyncQueue <int>(); queue.TryWrite(1); queue.TryWrite(2); queue.TryWrite(3); Assert.That(await queue.WaitAsync(), Is.True); Assert.That(queue.Read(), Is.EqualTo(1)); Assert.That(await queue.WaitAsync(), Is.True); Assert.That(queue.Read(), Is.EqualTo(2)); Assert.That(await queue.WaitAsync(), Is.True); Assert.That(queue.Read(), Is.EqualTo(3)); }
public void WritingCompletedQueueIsFalse() { var queue = new AsyncQueue <int>(); queue.Complete(); Assert.That(queue.TryWrite(1), Is.False); }
public async Task WritingQueueEndsWait() { var queue = new AsyncQueue <int>(); var task = Task.Run(async() => await queue.WaitAsync()); Assert.That(queue.TryWrite(1), Is.True); Assert.That(await task, Is.True); Assert.That(queue.Read(), Is.EqualTo(1)); }
/// <summary> /// Adds a connection to terminate. /// </summary> /// <param name="connection">The connection.</param> public void Add(MemberConnection connection) { ThrowIfDisposed(); if (_connections.TryWrite(connection)) { return; } // that should not happen, but log to be sure _logger.LogWarning($"Failed to add a connection ({connection})."); }
public async Task Enumerate() { var queue = new AsyncQueue <int>(); var list = new List <int>(); var task = Task.Run(async() => { await foreach (var i in queue) { list.Add(i); } }); for (var i = 0; i < 100; i++) { Assert.That(queue.TryWrite(i), Is.True); } queue.Complete(); await task; Assert.That(list.Count, Is.EqualTo(100)); }