我正在创建一个类似class的流,该流继承自Stream
。当我使用StreamWriter
类异步编写信息时:
using (var sw = new StreamWriter(messageWriter, Encoding.UTF8))
await sw.WriteAsync(msg);
我可以看到如何StreamWriter
直接void Stream.Write(byte[] buffer, int offset, int count)
而不是Task Stream.WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
。
这是错误还是我错过了什么?
我发现了混乱的根源。
StreamWriter
默认情况下,同步刷新,除非您专门进行异步刷新。
Stream.Flush
在关闭(当然是冲洗)时被调用。
这将调用Write
而不是WriteAsync
在messageWriter
流中:
using (var sw = new StreamWriter(messageWriter, Encoding.UTF8))
await sw.WriteAsync("Hi");
在StreamWriter
将缓冲“Hi”的消息,并且其将被释放到底层流上Flush
关闭时同步地调用StreamWriter
。
因此,异步调用toStreamWriter.WriteAsync
不会对基础流产生任何影响(因为有缓冲),并且在调用StreamWriter.Close
时StreamWriter.Flush
会被同步调用,因此Flush
将对基础流进行调用。
此代码还Write
同步调用:
using (var sw = new StreamWriter(messageWriter, Encoding.UTF8))
{
sw.AutoFlush = true; // will call Write here to send the UTF8 BOM
await sw.WriteAsync("Hi"); // Write the actual data
}
显然这也是:
using (var sw = new StreamWriter(messageWriter, Encoding.UTF8))
{
await sw.WriteAsync("Hi");
sw.Flush();
}
这将称为WriteAsync
:
using (var sw = new StreamWriter(messageWriter, Encoding.UTF8))
{
await sw.WriteAsync("Hi");
await sw.FlushAsync()
}
我创建了一个简单的类来跟踪方法的调用方式:
public class MSWrite : MemoryStream
{
public override bool CanWrite { get { return true; } }
public override void Write(byte[] buffer, int offset, int count)
{
Console.WriteLine("Write");
}
public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
Console.WriteLine("WriteAsync");
return Task.Run(() => { });
}
}
而这个测试:
Console.WriteLine("Simple");
using(var ms = new MSWrite())
using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
{
await sw.WriteAsync("Hi");
}
Console.WriteLine();
Console.WriteLine("AutoFlush");
using (var ms = new MSWrite())
using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
{
sw.AutoFlush = true;
await sw.WriteAsync("Hi");
}
Console.WriteLine();
Console.WriteLine("Flush async");
using (var ms = new MSWrite())
using (StreamWriter sw = new StreamWriter(ms, Encoding.UTF8))
{
await sw.WriteAsync("Hi");
await sw.FlushAsync();
}
产量:
Simple
Write
Write
AutoFlush
Write
WriteAsync
Flush async
WriteAsync
WriteAsync
第一个是UTF8 BOM,第二个是实际数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句