diff --git a/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs b/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs index 269a756cd040d..c5317953fdb7a 100644 --- a/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs +++ b/src/libraries/System.IO/tests/StreamWriter/StreamWriter.WriteTests.cs @@ -415,5 +415,20 @@ public void StreamWriter_WithOptionalArguments_NoExceptions() Assert.False(tempStream.CanRead); } } + + [Fact] + public async Task StreamWriter_WriteAsync_EmitBOMAndFlushDataWhenBufferIsFull() + { + Encoding UTF8BOM = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true, throwOnInvalidBytes: true); + + using (var s = new MemoryStream()) + using (var writer = new StreamWriter(s, UTF8BOM, 4)) + { + await writer.WriteAsync("abcdefg"); + await writer.FlushAsync(); + + Assert.Equal(10, s.Length); // BOM (3) + string value (7) + } + } } } diff --git a/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs b/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs index ce84fbfe85b7e..875211723da6b 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IO/StreamWriter.cs @@ -941,10 +941,7 @@ private Task FlushAsyncInternal(bool flushStream, bool flushEncoder, Cancellatio return Task.CompletedTask; } - Task flushTask = Core(flushStream, flushEncoder, cancellationToken); - - _charPos = 0; - return flushTask; + return Core(flushStream, flushEncoder, cancellationToken); async Task Core(bool flushStream, bool flushEncoder, CancellationToken cancellationToken) { @@ -961,6 +958,7 @@ async Task Core(bool flushStream, bool flushEncoder, CancellationToken cancellat byte[] byteBuffer = _byteBuffer ??= new byte[_encoding.GetMaxByteCount(_charBuffer.Length)]; int count = _encoder.GetBytes(new ReadOnlySpan(_charBuffer, 0, _charPos), byteBuffer, flushEncoder); + _charPos = 0; if (count > 0) { await _stream.WriteAsync(new ReadOnlyMemory(byteBuffer, 0, count), cancellationToken).ConfigureAwait(false);