Проблемы параллелизма сокетов .NET C # - PullRequest
4 голосов
/ 26 августа 2009

Экземпляр System.Net.Sockets.Socket

может использоваться двумя потоками, поэтому один использует метод send (), а другой - метод receive ()?

Это безопасно?

Что ж, мне нужно, чтобы он был не только поточно-ориентированным, но и чтобы методы отправки / получения не были синхронизированы, чтобы позволить каждому потоку вызывать их одновременно.

У меня есть другой способ сделать это?

Спасибо за помощь, я имею опыт работы с Java, но с трудом пытаюсь это сделать.

Ответы [ 3 ]

6 голосов
/ 27 августа 2009

Это должно быть безопасно, да. Класс Socket указан MSDN как полностью поточно-ориентированный .

Однако я не знаю, хорошая ли это идея. Вы можете сделать это для себя трудным, используя два потока. Возможно, вы захотите взглянуть на BeginSend и BeginReceive для асинхронных версий, в этом случае вам не нужно использовать несколько потоков.

2 голосов
/ 06 октября 2012

Немного не по теме, но использование методов de sync полезно только при ограниченных клиентах. Я понял, что асинхронные сокеты медленнее с ответом. Async soockets намного лучше справляется со многими клиентами.

Итак: Синхронизация намного быстрее. асинхронность более масштабируема

2 голосов
/ 27 августа 2009

Да, совершенно безопасно получить доступ к отправке и получению из двух разных потоков одновременно.

Если вы хотите, чтобы ваше приложение масштабировалось до 100 активных сокетов, вам следует использовать методы BeginReceiveve / BeginSend, а не создавать потоки вручную. Это сделает магию за кулисами, чтобы вы не создавали сотни потоков для обработки сокетов. Что именно он делает, зависит от платформы. В Windows вы будете использовать «высокопроизводительные» порты завершения io. Под Linux (моно) вы будете использовать epoll, я полагаю. В любом случае вы будете использовать гораздо меньше потоков, чем активных сокетов, что всегда хорошо:)

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