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