Все, что я читал о сокетах в .NET, говорит о том, что асинхронный шаблон обеспечивает лучшую производительность (особенно с новым SocketAsyncEventArgs, который экономит на распределении).
Я думаю, что это имеет смысл, если мы говорим о сервере с множеством клиентских подключений, где невозможно выделить один поток для каждого подключения. Затем я вижу преимущество использования потоков ThreadPool и получения асинхронных обратных вызовов для них.
Но в моем приложении я являюсь клиентом, и мне просто нужно прослушать, как один сервер отправляет рыночные тиковые данные по одному TCP-соединению. Прямо сейчас я создаю отдельный поток, устанавливаю приоритет Highest и вызываю Socket.Receive () с ним. Мой поток блокирует этот вызов и просыпается при поступлении новых данных.
Если бы я переключил это на асинхронный шаблон, чтобы получить обратный вызов при появлении новых данных, я вижу две проблемы
Потоки потоков будут иметь приоритет по умолчанию, поэтому кажется, что они будут строго хуже моего собственного потока с наивысшим приоритетом.
Мне все равно придется отправлять все через один поток в какой-то момент. Скажем, я получаю одновременно N обратных вызовов в N различных потоках потоков, уведомляя меня о появлении новых данных. N-байтовые массивы, которые они доставляют, не могут быть обработаны в потоках пула потоков, потому что нет гарантии, что они представляют N уникальных сообщений рыночных данных, потому что TCP основан на потоке. В любом случае мне придется блокировать и помещать байты в массив и сигнализировать другому потоку, который может обрабатывать то, что находится в массиве. Так что я не уверен, что, имея N потоков пула, покупает меня.
Я думаю об этом неправильно? Есть ли причина использовать шаблон Async в моем конкретном случае, когда один клиент подключен к одному серверу?
UPDATE:
Так что я думаю, что неправильно понял схему асинхронности в (2) выше. Я получил бы обратный вызов в одном рабочем потоке, когда были доступны данные. Затем я начинаю другой асинхронный прием и получаю еще один обратный вызов и т. Д. Я не получу N обратных вызовов одновременно.
Вопрос все тот же, хотя. Есть ли причина, по которой обратные вызовы были бы лучше в моей конкретной ситуации, когда я являюсь клиентом и подключен только к одному серверу.