У меня есть класс DocumentGenerator
который переносит a MemoryStream
. Таким образом, я реализовал IDisposable
на классе.
Я не вижу, как/где я могу возможно расположить его все же.
Это - мой текущий код, который выполняет загрузку файла в MVC:
using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))
{
/* some document manipulation with the
DocumentGenerator goes here ...*/
return File(dg.GetDocumentStream(), "text/plain", filename);
}
Это ошибки как поток закрыты/расположены перед контроллером, закончилось с ним. Как я могу удостовериться, что мои ресурсы правильно расположены в этой ситуации?
Править: Моя реализация IDisposable
в данный момент просто располагает MemoryStream
. Я знаю, что это не надлежащая реализация, я просто использовал его в качестве теста. Есть ли что-то другое, что я мог сделать здесь, чтобы заставить его работать?
public void Dispose()
{
_ms.Dispose();
_ms = null;
}
Вам не нужно удалять поток. Он будет удален методом FileStreamResult.WriteFile . Отрывок кода из этого класса:
public FileStreamResult(Stream fileStream, string contentType) : base(contentType)
{
if (fileStream == null)
{
throw new ArgumentNullException("fileStream");
}
this.FileStream = fileStream;
}
protected override void WriteFile(HttpResponseBase response)
{
Stream outputStream = response.OutputStream;
using (this.FileStream)
{
byte[] buffer = new byte[0x1000];
while (true)
{
int count = this.FileStream.Read(buffer, 0, 0x1000);
if (count == 0)
{
return;
}
outputStream.Write(buffer, 0, count);
}
}
}
Обратите внимание на с использованием
. Когда вы вызываете File (dg.GetDocumentStream (), "text / plain", filename)
из вашего контроллера, это вызывает конструктор, который сохраняет поток в общедоступное свойство, которое удаляется во время рендеринга.
Заключение: вам не нужно беспокоиться об удалении получения потока с помощью dg.GetDocumentStream ()
.
Чтобы добавить к тому, что сказал Дарин , важно отметить эту концепцию:
public Stream GetDownloadFile(...)
{
using (var stream = new MemoryStream()) {
return stream;
}
}
public Stream GetDownloadFile(...)
{
using (var generator = DocumentGenerator.OpenTemplate(path))
{
// Document manipulation.
return File(generator.GetDocumentStream(), "text/plain", filename);
}
}
Независимо от того, как вы используете его в своем методе, блок using гарантирует, что Dispose всегда вызывается, это важно, если вы решите использовать результат блока using в качестве оператора возврата, это не помешает его удалению ....