Каковы масштабируемые методы постановки рабочих элементов в очередь в асинхронных обратных вызовах TCP-сервера в C #? - PullRequest
1 голос
/ 31 января 2011

Согласно этому сообщению:

Как написать масштабируемый сервер на базе Tcp / Ip

jerrylvl состояний:

- - - - - - - - - - *

Обработка

Когдавы получаете обратный вызов от начального вызова, который вы сделали, очень важно понимать, что код обратного вызова будет выполняться в низкоуровневом потоке IOCP.Абсолютно необходимо избегать длительных операций в этом обратном вызове.Использование этих потоков для сложной обработки убьет вашу масштабируемость так же эффективно, как и использование «потока на соединение».

Предлагаемое решение состоит в том, чтобы использовать обратный вызов только для постановки в очередь рабочего элемента для обработки входящих данных,это будет выполнено в каком-то другом потоке.Избегайте любых потенциально блокирующих операций внутри обратного вызова, чтобы поток IOCP мог вернуться в свой пул как можно быстрее.В .NET 4.0 я бы предложил самое простое решение - создать Task, указав в нем ссылку на сокет клиента и копию первого байта, который уже был прочитан вызовом BeginReceive.Затем эта задача отвечает за чтение всех данных из сокета, представляющих обрабатываемый вами запрос, его выполнение, а затем выполнение нового вызова BeginReceive, чтобы снова поставить в очередь сокет для IOCP.До версии .NET 4.0 вы могли использовать ThreadPool или создавать собственную реализацию многопоточной очереди работы.

- - - - - - - - - - *

Мой вопрос, как именно я буду делать это в .Net 4.0?Может ли кто-нибудь предоставить мне пример кода, который будет хорошо работать в масштабируемой среде?

Спасибо!

1 Ответ

0 голосов
/ 18 марта 2011

На мой вопрос был дан более подробный ответ: C # - Когда использовать стандартные потоки, ThreadPool и TPL на высокоактивном сервере

Это касается специфики использования каждогоTPL, ThreadPool и стандартные потоки для выполнения рабочих элементов и когда использовать каждый метод.

...