Это не дубликат.
Ваш код отличается от связанного дубликата, поскольку в вашем коде IDisposable
передается другому потоку.
Общее правило заключается в том, что если вы создаете объект, который реализует IDisposable
, то вы отвечаете за вызов Dispose
для него, когда закончите с ним. По возможности это следует делать в блоке using
, чтобы всегда вызывать Dispose
. В вашем случае ваш код не завершен с объектом, пока не завершится другой поток. В этом потоке вы правильно вызываете Dispose
в блоке finally
.
Если бы вы позвонили Dispose
на NetworkStream
, то он бы тоже закрыл StreamReader
, что бы победило вашу цель. Я подозреваю, что было бы то же самое, если бы вы позвонили Dispose
на Socket
. Таким образом, ваш код правильный, как есть.
Объект на стороне клиента не имеет отношения к объекту на стороне сервера, кроме как через TCP / IP. Тот факт, что клиент может вызвать Dispose
на своем сокете, не означает, что сервер должен вызвать Dispose
на своем сокете. Однако, как только сервер завершит чтение данных из сокета и соединение будет закрыто, сокет на стороне сервера должен иметь значение Disposed
. Я не знаю наверняка, но я полагаю, что при удалении StreamReader
базовый NetworkStream
будет удален, что должно вызвать Dispose
в сокете, из которого был создан поток.
Ваш код в порядке, за исключением некоторых не связанных проблем: вам не нужно устанавливать cmd
в null
, так как вы собираетесь установить значение в следующем операторе. Кроме того, вы не должны использовать пустой блок catch
как этот. Вы не представляете, какое исключение было сгенерировано, но вы все равно будете его игнорировать, даже не регистрируя и не отображая исключение. По крайней мере, вы должны сделать
catch (Exception ex)
{
Console.WriteLine("Disconnected by exception " + ex.ToString());
}
finally
{
Console.WriteLine("Finally Done.");
reader.Dispose();
}