1

我有一个自定义格式化程序来支持我的网络调用,但是一个错误报告揭示了一个问题。我正在覆盖WriteToStreamAsync()这样的方法:

public override Task WriteToStreamAsync(Type type,
                                        object value,
                                        Stream writeStream,
                                        HttpContent content,
                                        TransportContext transportContext)
{
    return Task.Run(() =>
        {
            if (value == null) return;
            using (var sw = new StreamWriter(writeStream))
            {
                var serialized = _serializer.Serialize(value);
                sw.Write(serialized);
            }
        });
}

根据这篇文章,问题在于该using语句导致流关闭。解决方案是删除using语句并使用显式Flush()调用,但依赖 GC 处理StreamWriter.

public override Task WriteToStreamAsync(Type type,
                                        object value,
                                        Stream writeStream,
                                        HttpContent content,
                                        TransportContext transportContext)
{
    return Task.Run(() =>
        {
            if (value == null) return;
            var sw = new StreamWriter(writeStream);
            var serialized = _serializer.Serialize(value);
            sw.Write(serialized);
            sw.Flush();
        });
}
  1. 这是一个主要问题吗?
  2. 有没有更好(更“最佳实践”)的方式来做到这一点?
4

1 回答 1

1

这是一个主要问题吗?

不,如果Stream读者幸存下来并且很清楚,谁负责处理流。

它在 .NET Framework 中也很常见。例如,如果 anIcon是从 a 创建的Stream,则不得释放它(创建图标时不要使用该using构造),因为创建的实例将使用它。

有没有更好(更“最佳实践”)的方式来做到这一点?

  • 如果您在同一范围内同时创建 theStream和 the ,则故事很清楚,您可以将它们处理掉。StreamWriter
  • 如果您获得一个已经存在StreamStream. 除非文档明确说明,否则不要关闭它。
于 2015-09-28T14:30:12.820 回答