You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查StreamWriter的Flush方法是否已被调用?

检查StreamWriter.Flush()是否被调用的几种可行方案

方案一:自定义可追踪的StreamWriter包装类

通过继承StreamWriter扩展一个带状态标记的子类,直接在Flush相关方法里记录调用状态,这是最通用的解决方案:

public class TrackableStreamWriter : StreamWriter
{
    public bool HasFlushed { get; private set; }
    public bool HasFlushedAsync { get; private set; }

    public TrackableStreamWriter(Stream stream) : base(stream) { }

    public override void Flush()
    {
        HasFlushed = true;
        base.Flush();
    }

    public override Task FlushAsync()
    {
        HasFlushedAsync = true;
        return base.FlushAsync();
    }

    public override Task FlushAsync(CancellationToken cancellationToken)
    {
        HasFlushedAsync = true;
        return base.FlushAsync(cancellationToken);
    }
}

替换你原有代码中的StreamWriter,即可随时检查调用状态:

var writer = new TrackableStreamWriter(context.Response.Body);
try
{
    await Router.DownloadHandler.ProcessAsync(context).ConfigureAwait(false);
}
catch (Exception ex)
{
    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
    WriteException(writer, ex);
}
finally
{
    // 根据标记判断是否需要手动执行Flush
    if (!writer.HasFlushedAsync)
    {
        await writer.FlushAsync().ConfigureAwait(false);
    }
    writer.Dispose();
}

方案二:单元测试场景用Mock框架验证

如果是在单元测试中需要验证Flush是否被调用,可以用Moq这类Mock框架创建代理对象,直接验证方法调用次数:

var mockWriter = new Mock<StreamWriter>(MockBehavior.Loose, new MemoryStream());
// 执行待测试的业务代码...

// 验证同步Flush被调用至少一次
mockWriter.Verify(w => w.Flush(), Times.AtLeastOnce);
// 验证异步Flush被调用至少一次
mockWriter.Verify(w => w.FlushAsync(), Times.AtLeastOnce);

方案三:手动添加状态标记(简单场景)

如果不想编写包装类,也可以在代码中直接维护一个布尔变量,手动标记Flush的调用状态:

var writer = new StreamWriter(context.Response.Body);
bool hasFlushed = false;
try
{
    await Router.DownloadHandler.ProcessAsync(context).ConfigureAwait(false);
}
catch (Exception ex)
{
    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
    WriteException(writer, ex);
    // 若WriteException内部调用了Flush,手动标记状态
    hasFlushed = true;
}
finally
{
    if (!hasFlushed)
    {
        await writer.FlushAsync().ConfigureAwait(false);
    }
    writer.Dispose();
}

这种方式适合逻辑简单的场景,但需要你明确知道所有可能调用Flush的位置,灵活性较差。

内容的提问来源于stack exchange,提问作者Dmytro Kryvoruchenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:27:21