Метод Dispose
Stream.Dispose закрывает поток.
Конструкция using вызывает
Dispose при выходе из блока. После
закрытия чтение бросает
ObjectDisposedException. Сброс
буфера перед закрытием -
Flush.
У асинхронного API есть
DisposeAsync.
Синтаксис
stream.Dispose();
using (Stream stream = new MemoryStream())
{
}
Пример
Давайте закроем поток вручную через
Dispose:
using System;
using System.IO;
class Program
{
static void Main()
{
var ms = new MemoryStream();
ms.Write([1, 2, 3, 4, 5], 0, 5);
ms.Dispose();
bool res = ms.CanRead;
Console.WriteLine(res);
}
}
Результат выполнения кода:
False
Пример
Давайте поймаем
ObjectDisposedException при чтении
после закрытия:
using System;
using System.IO;
class Program
{
static void Main()
{
var ms = new MemoryStream();
ms.Write([1, 2, 3, 4, 5], 0, 5);
ms.Dispose();
byte[] buf = new byte[1];
try
{
ms.Read(buf, 0, 1);
}
catch (ObjectDisposedException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Пример
Давайте убедимся, что using тоже
закрывает поток:
using System;
using System.IO;
class Program
{
static void Main()
{
MemoryStream ms;
using (ms = new MemoryStream())
{
ms.Write([1, 2, 3, 4, 5], 0, 5);
}
bool res = ms.CanRead;
Console.WriteLine(res);
}
}
Результат выполнения кода:
False