Вопросы по асинхронным сокетам C # - PullRequest
5 голосов
/ 15 марта 2010

Основываясь на моем чтении и тестировании, с асинхронными сокетами сам сокет может быть передан с использованием объекта состояния (результат IAsyncResult), также если хранить сокет как частное поле, он будет захвачен методами обратного вызова.

Мне интересно, как IAysnResult хранится между BeginXXX и ReceiveXXX? Мне кажется, что после вызова BeginXXX и завершения метода объект состояния будет удален GC, если на него нет ссылки.

В случае частного поля, как личное поле распределяется между потоками? (Насколько я знаю, обратный вызов выполняется с использованием потока из пула потоков по умолчанию, который будет рассматриваться как новый поток.) ​​

Большое спасибо, надеюсь, сами вопросы понятны.

1 Ответ

0 голосов
/ 15 марта 2010

GC не удаляет объекты, а освобождает память, используемую объектами без ссылок. Код клиента должен располагать объекты, GC никогда не делает этого.

IAysnResult по-прежнему имеет ссылку в делегате, выполняемом в пуле потоков, поэтому GC unitl не будет собирать метод обратного вызова.

Закрытые члены всегда видны исполняющему потоку, поэтому ваше поле закрытого сокета будет доступно для всех потоков, которые выполняют методы содержащего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...