【发布时间】:2014-03-16 20:55:44
【问题描述】:
我一直在思考什么是使用异步编程设置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 还是我能做些什么?
这种方法有什么潜在的缺陷吗?
【问题讨论】:
标签: c# asynchronous threadpool async-await tcplistener