如何检查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
相关产品推荐
相关产品推荐

