我有一个自定义格式化程序来支持我的网络电话,但错误报告揭示了一个问题。我这样覆盖了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();
});
}
答案 0 :(得分:1)
这是一个主要问题吗?
不,如果Stream
幸存下来并且很清楚,谁负责处理流。
在.NET Framework中也很常见。例如,如果从Icon
创建Stream
,则不得丢弃它(在创建图标时不要使用using
构造),因为它将被创建使用实例
有更好的(更“最佳实践”)方式吗?
Stream
和StreamWriter
,则故事很明确,您可以将其丢弃。Stream
,则无法确定是否允许您处置Stream
。除非文档明确说明,否则不要关闭它。