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

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

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

--------------------------
No ROM Basic...
...
Рейтинг: 0 / 0
23.10.2020, 06:54
    #40011064
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сколько раз можно закрыть TcpClient?
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
23.10.2020, 06:55
    #40011065
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сколько раз можно закрыть TcpClient?
Это вполне нормально. Общепринятый паттерн это то, что методы наподобие "Dispose", "Close" и т.п. при повторном вызове просто ничего не делают. Как правило для этого внутри объекта есть приватный флаг который показывает что такой метод уже вызывался и при повторном вызове он проверяется.
...
Рейтинг: 0 / 0
23.10.2020, 14:22
    #40011215
SIMPLicity_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сколько раз можно закрыть TcpClient?
Спасибо!
PS Но буду аккуратнее...
...
Рейтинг: 0 / 0
23.10.2020, 14:43
    #40011230
fkthat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сколько раз можно закрыть TcpClient?
Кстати, еще, даже когда ты вызвал Close/Dispose сокет какое-то время (запросто могу ошибаться, но по-моему дефолтно 7 секунд) все равно остается открытым. Это не особенность .NET, а согласно спекам TCP. Если ты все время открываешь и закрывааешь много соединений, то это может иметь значение (т.н. port exhaustion).
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сколько раз можно закрыть TcpClient? / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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