【问题标题】:Custom MedaTypeFormatter Causes ObjectDisposedException自定义 MedaTypeFormatter 导致 ObjectDisposedException
【发布时间】:2015-09-28 14:12:40
【问题描述】:

我有一个自定义格式化程序来支持我的网络调用,但是一个错误报告揭示了一个问题。我正在重写 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. 有没有更好(更“最佳实践”)的方法?

【问题讨论】:

  • 您是在问如何正确关闭StreamWriter 而不关闭其基本流? Click.
  • @sinatr,是的,我认为那将是理想的。
  • 点击点击(在之前的评论中),希望你可以使用.Net 4.5。
  • @Sinatr,回答你可以得到一些代表!

标签: c# garbage-collection streamwriter disposable


【解决方案1】:

这是一个主要问题吗?

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

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

有没有更好(更“最佳实践”)的方法?

  • 如果您在同一范围内同时创建 StreamStreamWriter,则情况很清楚,您可以将它们丢弃。
  • 如果你得到一个已经存在的Stream,你不能确定你是否被允许处置Stream。除非文档明确说明,否则不要关闭它。

【讨论】:

    猜你喜欢
    • 2019-03-02
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    • 2014-07-25
    • 2017-08-05
    • 2019-11-11
    相关资源
    最近更新 更多