public void ResetCancelsWriteTasks()
        {
            var sut        = new BufferedChannel <int>(0);
            var writeTask1 = sut.TryWriteSafeAsync(1);
            var writeTask2 = sut.TryWriteSafeAsync(2);

            sut.Reset();
            writeTask1.Result.ShouldBeFalse();
            writeTask2.Result.ShouldBeFalse();
        }
        public void ResetCancelsReadTasks()
        {
            var sut       = new BufferedChannel <int>(0);
            var readTask1 = sut.TryReadSafeAsync();
            var readTask2 = sut.TryReadSafeAsync();

            sut.Reset();
            readTask1.Result.HasValue.ShouldBeFalse();
            readTask2.Result.HasValue.ShouldBeFalse();
        }
#pragma warning disable xUnit1026 // Theory methods should use all of their parameters
        public void CanWriteAndReadFromSeveralThreadsConcurrently(int writeThreads, int readThreads, int bufferSize)
#pragma warning restore xUnit1026 // Theory methods should use all of their parameters
        {
            var writeCount = readThreads * 100;
            var readCount  = writeThreads * 100;
            var sut        = new BufferedChannel <int>(bufferSize);

            for (var reuse = 0; reuse < 3; reuse++)
            {
                async Task WriteWorker()
                {
                    for (var i = 0; i < writeCount; i++)
                    {
                        await sut.WriteAsync(i).ConfigureAwait(false);
                    }
                }

                async Task ReadWorker()
                {
                    for (var i = 0; i < readCount; i++)
                    {
                        await sut.ReadAsync().ConfigureAwait(false);
                    }
                }

                var writeTasks = Enumerable.Range(0, writeThreads).Select(_ => Task.Run(WriteWorker));
                var readTasks  = Enumerable.Range(0, readThreads).Select(_ => Task.Run(ReadWorker));
                var allTasks   = writeTasks.Concat(readTasks).ToArray();

                Task.WhenAll(allTasks).ShouldCompleteIn(Timeout10Sec);

                sut.TryReadSafe(out int _).ShouldBe(false);
                sut.TryComplete().ShouldBe(true);

                sut.Reset();
            }
        }