ObjectDisposedException при использовании нескольких асинхронных клиентов на нескольких серверах - PullRequest
1 голос
/ 28 ноября 2011

Я изучал примеры Asynchronous Client и Asynchronous Server Socket на MSDN и успешно продемонстрировал пример, который работает безупречно, когда один Клиент подключается к одному Серверу. Моя проблема в том, что мне нужно синхронизировать часть работы с несколькими машинами, чтобы они выполнялись примерно в одно и то же время (например, разница в миллисекундах). Действие достаточно простое, поговорите с дочерними серверами (все они работают на одном компьютере, но на разных портах для начального тестирования), смоделируйте его обработку и отправьте сигнал «Готов» обратно вызывающей стороне. После того как все серверы вернули этот флаг (или произошел тайм-аут), второе сообщение от клиента передается на подтвержденные серверы с указанием выполнить.

Мой подход до сих пор состоял в том, чтобы создать два клиентских экземпляра, хранящихся в списке, и запустить процедуру, просматривая список. Это работает хорошо, но не особенно быстро, поскольку рутина каждого клиента выполняется синхронно. Чтобы ускорить процесс, я создал новый поток и выполнил подпрограмму для каждого клиента. Теперь это работает, позволяя двум или более серверам вернуться назад и синхронизироваться соответствующим образом. К сожалению, это очень подвержено ошибкам, и ошибки кода с исключением «ObjectDisposedException» в следующей строке метода «ReceiveCallback» ...

// Read data from the remote device.
int bytesRead = client.EndReceive(ar);

С некоторыми исследованиями и отладкой я отследил сокеты, передаваемые подпрограмме (используя ее дескриптор), и обнаружил, что когда она не подключена, всегда возвращается второй сокет, который возвращается, а не первый, который успешно считывает его ответ. Кроме того, эти экземпляры сокетов (основанные на значении дескриптора) представляются отдельными экземплярами, но каким-то образом второй (и последующие ответы) продолжают выдавать ошибку в этой строке.

Что заставляет эти сокеты ненадлежащим образом утилизировать себя перед тем, как их законно обработать? Поскольку они выполняются в отдельных потоках и не имеют общих подпрограмм, используется ли первый сокет ненадлежащим образом в других экземплярах? Но я чувствую себя немного потерянным в море, и хотя я могу исправить эти ошибки, надежность кода и потенциальная потеря возвращаемых подтверждений не является благоприятной целью. Есть указатели?

С уважением

1 Ответ

1 голос
/ 29 ноября 2011

Оказывается, что общий / статический ManualResetEvent был установлен для разных экземпляров, поэтому поток 1 установит ManualResetEvent, удаляя сокет во втором потоке. Обеспечивая, чтобы никакие методы / свойства не были общими / статическими - каждый поток и сокет выполнялись в своей собственной области.

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