/// <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();
        }
Exemplo n.º 2
0
        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));
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        public void WritingCompletedQueueIsFalse()
        {
            var queue = new AsyncQueue <int>();

            queue.Complete();

            Assert.That(queue.TryWrite(1), Is.False);
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
        /// <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}).");
        }
Exemplo n.º 7
0
        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));
        }