Пользовательский MedaTypeFormatter вызывает ObjectDisposedException
У меня есть собственный форматировщик для поддержки моих веб-звонков, но отчет об ошибках пролил некоторый свет на проблему. Я переопределял 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 ответ
Это серьезная проблема?
Нет, если Stream
Выживает читатель и становится ясно, кто отвечает за утилизацию потока.
Это распространено и в.NET Framework. Например, если Icon
создан из Stream
, вы не должны утилизировать его (не используйте using
создать при создании значка), потому что он будет использоваться созданным экземпляром.
Есть ли лучший (более практичный) способ сделать это?
- Если вы создаете оба
Stream
иStreamWriter
в том же объеме история понятна, вы можете распоряжаться ими. - Если вы получаете уже существующий
Stream
, вы не можете быть уверены, что вам разрешеноStream
, Не закрывайте его, если в документации нет четкого представления об этом.