Я думал о том, как правильно настроить TCP-сервер, используя асинхронное программирование.
Обычно я создавал поток для каждого входящего запроса, но я хотел бы использовать большую часть ThreadPool, поэтому, когда соединения простаивают, потоки заблокированы.
Сначала я бы создал слушателя и начал принимать клиентов в этом случае в приложении консоли:
static void Main(string[] args)
{
CancellationTokenSource cancellation = new CancellationTokenSource();
var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
TcpListener server = new TcpListener(endpoint);
server.Start();
var task = AcceptTcpClients(server, cancellation.Token);
Console.ReadKey(true);
cancellation.Cancel();
await task;
Console.ReadKey(true);
}
В этом методе я получал бы цикл, принимающий входящие запросы, и создавал новую задачу для обработки соединения, поэтому цикл может вернуться, чтобы принять больше клиентов:
static async Task AcceptTcpClients(TcpListener server, CancellationToken token)
{
while (!token.IsCancellationRequested)
{
var ws = await server.AcceptTcpClientAsync();
Task.Factory.StartNew(async () =>
{
while (ws.IsConnected && !token.IsCancellationRequested)
{
String msg = await ws.ReadAsync();
if (msg != null)
await ws.WriteAsync(ProcessResponse(msg));
}
}, token);
}
}
Создание новой задачи необязательно означает новый поток, но правильно ли это? Я пользуюсь ThreadPool или есть что-нибудь еще, что я могу сделать?
Есть ли потенциальная ошибка в этом подходе?