아래의 코드는 C#으로 간단히 작성해본 에코 서버입니다. 전송한 텍스트를 그대로 반환해주는데요, 이 코드보다 더 간결하게 작성하는 방법이 있을까요?
※ Accept부터 모든 네트워크 I/O를 비동기로 구성해서 스레드풀에서 사용하는 스레드는 연결 갯수에 따라 증가하지 않아야 합니다.
using System.Net.Sockets;
var ts = TcpListener.Create(6000);
ts.Start();
_ = Task.Run(async () =>
{
while (true)
{
var client = await ts.AcceptTcpClientAsync();
var s = client.GetStream();
_ = Task.Run(async () =>
{
using var br = new StreamReader(s);
using var bw = new StreamWriter(s);
while (true)
{
var text = await br.ReadLineAsync();
if (text is null)
break;
text = text.Trim();
Console.WriteLine($"{ThreadPool.ThreadCount}: {text}");
await bw.WriteLineAsync(text);
await bw.FlushAsync();
}
});
}
});
Console.ReadLine();
ts.Stop();
아 그랬군요… @dimohy 님은 데이터 수신이 쉴새없이 이어지는 환경이 아니라,
그때그때 단발성으로 수신된다면 스레드풀에 있던 task가 동시에 동작할 필요가 없어지고, 여유가 생기니까 하나의 스레드로 처리가 가능하다는걸 보여주신거 같아요.
(아닌가…ㅡ,.ㅡ) @Greg.Lee 님의 조언도 감사합니다.^^
저같은 경우 스레드 활용을 최대화시키기 위해서
아래 코드를 사용하곤 합니다.
최소 스레드를 강제 지정하는 코드입니다.
// Get thread pool information
int workerThreadsMin, completionPortThreadsMin;
ThreadPool.GetMinThreads(out workerThreadsMin, out completionPortThreadsMin);
int workerThreadsMax, completionPortThreadsMax;
ThreadPool.GetMaxThreads(out workerThreadsMax, out completionPortThreadsMax);
// Adjust min threads
ThreadPool.SetMinThreads(workerThreadsMax, completionPortThreadsMin);