powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сколько раз можно закрыть TcpClient?
5 сообщений из 5, страница 1 из 1
Сколько раз можно закрыть TcpClient?
    #40011044
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть TcpClient Client;
Несколько раз вызываю для него Client.Close()
Ошибки ни при отладке ни при работе не возникает.
Насколько плохо, что для уже "закрытого" Client повторно вызываю метод Close()?

Если это не хорошо, то как проверить ТЕКУЩЕЕ состояние Client ?

Client.Open() или что-то подобного не нашёл.

--------------------------
No ROM Basic...
...
Рейтинг: 0 / 0
Сколько раз можно закрыть TcpClient?
    #40011064
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_
Насколько плохо, что для уже "закрытого" Client повторно вызываю метод Close()?

Ни насколько - Close внутри себя вызывает Dispose, а Dispose, согласно класссической реализации этого паттерна, может вызываться сколько угодно раз:
If an object's Dispose method is called more than once, the object must ignore all calls after the first one. The object must not throw an exception if its Dispose method is called multiple times. Instance methods other than Dispose can throw an ObjectDisposedException when resources are already disposed.
https://docs.microsoft.com/en-us/dotnet/api/system.idisposable.dispose?redirectedfrom=MSDN&view=netcore-3.1#System_IDisposable_Dispose
SIMPLicity_
как проверить ТЕКУЩЕЕ состояние Client ?

Согласно исходникам , вызов Dispose устанавливает свойство Client в null - можно выполнять проверку TcpClient.Clent==null, если true, то был вызван Close/Dispose. Однако это тоже не особенно по фэншую. Поскольку TcpClient имплементирует IDisposable, то с ним нужно работать, как со всеми disposable-объектами - заворачивать их использование в using, и не вызывать явно Close/Dispose. После того, как действие выйдет за пределы using scope, у самого TcpClient автоматически будет вызван Dispose, а переменная, использованная в using scope, за его пределами уже будет недоступна, и вызвать на ней какой-либо метод (в т.ч. Close) не получится:
Код: c#
1.
2.
3.
4.
5.
using (var tcpClient = new TcpClient())
{
  tcpClient.Connect("www.microsoft.com", 80);
}
tcpClient.Close(); // < error CS0103: The name 'tcpClient' does not exist in the current context
...
Рейтинг: 0 / 0
Сколько раз можно закрыть TcpClient?
    #40011065
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это вполне нормально. Общепринятый паттерн это то, что методы наподобие "Dispose", "Close" и т.п. при повторном вызове просто ничего не делают. Как правило для этого внутри объекта есть приватный флаг который показывает что такой метод уже вызывался и при повторном вызове он проверяется.
...
Рейтинг: 0 / 0
Сколько раз можно закрыть TcpClient?
    #40011215
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
PS Но буду аккуратнее...
...
Рейтинг: 0 / 0
Сколько раз можно закрыть TcpClient?
    #40011230
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, еще, даже когда ты вызвал Close/Dispose сокет какое-то время (запросто могу ошибаться, но по-моему дефолтно 7 секунд) все равно остается открытым. Это не особенность .NET, а согласно спекам TCP. Если ты все время открываешь и закрывааешь много соединений, то это может иметь значение (т.н. port exhaustion).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сколько раз можно закрыть TcpClient?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]