Проблема заключается в том, что вызов CryptoStream.Dispose
может вызвать избавиться от заданного потока:
protected override void Dispose(bool disposing)
{
try
{
if (disposing)
{
if (!_finalBlockTransformed)
{
FlushFinalBlock();
}
if (!_leaveOpen)
{
_stream.Close();
}
}
}
...
}
Если вы используете конструктор, который принимает 4 параметра:
CryptoStream(Stream stream, ICryptoTransform transform, CryptoStreamMode mode, bool leaveOpen)
Последний аргумент определяет, является ли поток закрытым или нет. Вызов Close()
, в свою очередь, по умолчанию также вызывает Dispose
:
public virtual void Close()
{
/* These are correct, but we'd have to fix PipeStream & NetworkStream very carefully.
Contract.Ensures(CanRead == false);
Contract.Ensures(CanWrite == false);
Contract.Ensures(CanSeek == false);
*/
Dispose(true);
GC.SuppressFinalize(this);
}
Таким образом, похоже, что проверка не может правильно определить, будет ли конкретная реализация Stream удалена или нет, и вернется к мысли, что так и будет, - вот этот случай.
Обратите внимание, однако, что в большинстве случаев удаление дважды, один или ноль раз MemoryStream
не имеет большого значения.