自定义MedaTypeFormatter导致ObjectDisposedException

时间:2015-09-28 14:12:40

标签: c# garbage-collection streamwriter disposable

我有一个自定义格式化程序来支持我的网络电话,但错误报告揭示了一个问题。我这样覆盖了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);
            }
        });
}

根据this post,问题是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. 有更好的(更“最佳实践”)方式吗?

1 个答案:

答案 0 :(得分:1)

  

这是一个主要问题吗?

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

在.NET Framework中也很常见。例如,如果从Icon创建Stream,则不得丢弃它(在创建图标时不要使用using构造),因为它将被创建使用实例

  

有更好的(更“最佳实践”)方式吗?

  • 如果您在同一范围内创建StreamStreamWriter,则故事很明确,您可以将其丢弃。
  • 如果您已经存在Stream,则无法确定是否允许您处置Stream。除非文档明确说明,否则不要关闭它。