|
Сколько раз можно закрыть TcpClient?
|
|||
---|---|---|---|
#18+
есть TcpClient Client; Несколько раз вызываю для него Client.Close() Ошибки ни при отладке ни при работе не возникает. Насколько плохо, что для уже "закрытого" Client повторно вызываю метод Close()? Если это не хорошо, то как проверить ТЕКУЩЕЕ состояние Client ? Client.Open() или что-то подобного не нашёл. -------------------------- No ROM Basic... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2020, 23:14 |
|
Сколько раз можно закрыть TcpClient?
|
|||
---|---|---|---|
#18+
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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2020, 06:54 |
|
Сколько раз можно закрыть TcpClient?
|
|||
---|---|---|---|
#18+
Это вполне нормально. Общепринятый паттерн это то, что методы наподобие "Dispose", "Close" и т.п. при повторном вызове просто ничего не делают. Как правило для этого внутри объекта есть приватный флаг который показывает что такой метод уже вызывался и при повторном вызове он проверяется. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2020, 06:55 |
|
Сколько раз можно закрыть TcpClient?
|
|||
---|---|---|---|
#18+
Спасибо! PS Но буду аккуратнее... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2020, 14:22 |
|
Сколько раз можно закрыть TcpClient?
|
|||
---|---|---|---|
#18+
Кстати, еще, даже когда ты вызвал Close/Dispose сокет какое-то время (запросто могу ошибаться, но по-моему дефолтно 7 секунд) все равно остается открытым. Это не особенность .NET, а согласно спекам TCP. Если ты все время открываешь и закрывааешь много соединений, то это может иметь значение (т.н. port exhaustion). ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2020, 14:43 |
|
|
start [/forum/moderation_log.php?user_name=bookworm]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 10658ms |
total: | 10804ms |
0 / 0 |