Exemplo n.º 1
0
        public void DisposeDoesNotThrowIfUnflushedData()
        {
            var streamPipeWriter = new StreamPipeWriter(new MemoryStream());

            streamPipeWriter.Write(new byte[1]);

            streamPipeWriter.Dispose();
        }
        public async Task CancelPendingFlushLostOfCancellationsNoDataLost()
        {
            var writeSize         = 16;
            var singleWriteStream = new SingleWriteStream();

            MemoryStream = singleWriteStream;
            Writer       = new StreamPipeWriter(MemoryStream, minimumSegmentSize: writeSize);

            for (var i = 0; i < 10; i++)
            {
                FlushResult flushResult  = new FlushResult();
                var         expectedData = Encoding.ASCII.GetBytes(new string('a', writeSize));

                var tcs = new TaskCompletionSource <int>(TaskCreationOptions.RunContinuationsAsynchronously);
                // TaskCreationOptions.RunAsync

                var task = Task.Run(async() =>
                {
                    try
                    {
                        // Create two Segments
                        // First one will succeed to write, other one will hang.
                        for (var j = 0; j < 2; j++)
                        {
                            Writer.Write(expectedData);
                        }

                        var flushTask = Writer.FlushAsync();
                        tcs.SetResult(0);
                        flushResult = await flushTask;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        throw ex;
                    }
                });

                await tcs.Task;

                Writer.CancelPendingFlush();

                await task;

                Assert.True(flushResult.IsCanceled);
            }

            // Only half of the data was written because every other flush failed.
            Assert.Equal(16 * 10, ReadWithoutFlush().Length);

            // Start allowing all writes to make read succeed.
            singleWriteStream.AllowAllWrites = true;

            Assert.Equal(16 * 10 * 2, Read().Length);
        }