смотрел пример на msdn-е
https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example
Что-то не понял назначение allDone сообщения (как я подумал оно вобще для красоты).
Раскожите для чего? ... неужели слушать в многопотоке нельзя?
А Socket.BeginSend и Send потокобезопастны? то-есть можно ли одному экземпляру Socket вызывать из разных потоков одновременно эти методы (Выполниться поочерёдно?)?
заранее спасибо!
VYR>смотрел пример на msdn-е
VYR>https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example
Там в коде AsyncCallback и IAsyncResult — пример устарел лет на десять, и нужен только если у тебя остался махровый легаси. Современный .NET заточен под работу с async/await и System.IO.Pipelines.
VYR>Что-то не понял назначение allDone сообщения (как я подумал оно вобще для красоты).
VYR>Раскожите для чего? ... неужели слушать в многопотоке нельзя?
Что значит "слушать в многопотоке" я не знаю.
Но стандартный паттерн в
Asynchronous Programming Model (это как раз Begin/End) был такой:
1. Вызвать BeginAccept (вызывающий поток не блокируется),
2. В обработчике колбека первым делом снова вызвать BeginAccept (поток не блокируется)
3. Продолжить обработку входящего сокета.
В примере пошли немного другим путем и разделили обязанности.
Основной поток отвечает за исключительно за Accept, а отдельные потоки — исключительно за обработку каждого из входящих сокетов.
А allDone — способ синхронизации между ними.
После того, как Accept случился, обработчик запроса просто сигналит в основной поток: хей друг, есть Accept, я его буду дальше обрабатывать, а ты можешь снова вызывать BeginAccept.
Потому что, если в основном потоке вызывать BeginAccept в бесконечном цикле, ничем хорошим это не кончится.
VYR>А Socket.BeginSend и Send потокобезопастны? то-есть можно ли одному экземпляру Socket вызывать из разных потоков одновременно эти методы (Выполниться поочерёдно?)?
Согласно
документации да.
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>смотрел пример на msdn-е
VYR>https://docs.microsoft.com/en-us/dotnet/framework/network-programming/asynchronous-server-socket-example
Пример древний как навоз мамонта. Как минимум не стоит использовать методы Begin/EndXxx
VYR>Что-то не понял назначение allDone сообщения (как я подумал оно вобще для красоты).
Это не сообщение, а событие. Нужно для того чтобы
VYR>Раскожите для чего? ... неужели слушать в многопотоке нельзя?
Your callback method should invoke the EndAccept method. When your application calls BeginAccept, the system usually uses a separate thread to execute the specified callback method and blocks on EndAccept until a pending connection is retrieved. EndAccept will return a new Socket object that you can use to send and receive data with the remote host. You cannot use this returned Socket to accept any additional connections from the connection queue. If you want the original thread to block after you call the BeginAccept method, use WaitHandle.WaitOne. Call the Set method on a ManualResetEvent in the callback method when you want the original thread to continue executing.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Здравствуйте, vvv848165@ya.ru, Вы писали:
VYR>а какой посвежее — не могу найти — (но так чтобы для сервера с большим количеством соединений подошло)?
Первое что нагуглилось
https://codereview.stackexchange.com/a/31149... << RSDN@Home 1.3.17 alpha 5 rev. 62>>