通常我会在每个传入的请求中产生一个线程,但是我想做大部分的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);}
在这种方法中,我会循环接受传入的请求并产生一个新的Task来处理连接,所以循环可以重新接受更多的客户端:
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,还有什么我可以做的吗?
这种方法有什么潜在的陷阱吗?
解决方法 等待任务在你的Main将不会编译;你必须使用task.Wait();如果你想阻止它.此外,您应该在异步编程中使用Task.Run而不是Task.Factory.StartNew.
Creating new Task does not necessarily mean new thread,but is this the right way?
您当然可以启动单独的任务(使用Task.Run).虽然你不必.您可以轻松调用单独的异步方法来处理单个套接字连接.
但是,您的实际插座处理有一些问题. Connected属性几乎没用.你应该永远不断地从一个连接的套接字读取,即使你在写信给它.此外,您应该写“keepalive”消息或在您的读取超时,以便您可以检测半开状态.我维持一个TCP/IP .NET FAQ解释这些常见的问题.
我真的强烈建议人们不要写TCP / IP服务器或客户端.有大量的陷阱.如果可能,自主托管WebAPI和/或SignalR将会更好.
总结以上是内存溢出为你收集整理的c# – 使用异步/等待的异步TcpListener的正确方法全部内容,希望文章能够帮你解决c# – 使用异步/等待的异步TcpListener的正确方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)