【问题标题】:Double flush required?需要双冲吗?
【发布时间】:2012-12-01 21:33:08
【问题描述】:

刷新StreamWriter后是否需要刷新Stream

public static async Task WriteStringAsync(this Stream stream, string messageString)
{
        var encoding = new UTF8Encoding(false); //no BOM
        using (var streamWriter = new StreamWriter(stream, encoding))
        {
            await streamWriter.WriteAsync(messageString);
            await streamWriter.FlushAsync();
        }
        await stream.FlushAsync(); //is this necessary?
}

【问题讨论】:

    标签: c# stream flush streamwriter


    【解决方案1】:

    根据 MSDN 文档,这可以原谅为“只是确保”...

    StreamWriter.Flush():

    清除当前写入器的所有缓冲区,并将所有缓冲数据写入底层流。

    Stream.Flush():

    在派生类中重写时,清除此流的所有缓冲区,并导致将所有缓冲数据写入底层设备。

    ... 但是,仔细查看 TypeDescriptor 中的代码会发现 StreamWriter.Flush()(我假设它的异步对应 FlushAsync)是调用主函数的重载,传递两个布尔参数来指示 StreamWriter同时刷新 Stream 和 Unicode 编码器。因此,一次调用 StreamWriter.FlushAsync(),加上 await 关键字以确保异步操作完全发生,应该没问题。

    【讨论】:

      【解决方案2】:

      没必要,StreamWriter.FlushStreamWriter.FlushAsync 方法在内部调用Stream.Flush

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-25
        • 1970-01-01
        • 2019-03-04
        • 2010-12-22
        • 2013-09-10
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        相关资源
        最近更新 更多