C# 多个连接上的AcceptTcpClientAsync滞后

C# 多个连接上的AcceptTcpClientAsync滞后,c#,.net-core,lag,tcplistener,C#,.net Core,Lag,Tcplistener,我有一个服务器和一个客户端通过tcp连接。 如果同时向服务器发送多个连接请求,那么首先会快速创建多个连接,然后客户机每隔大约一秒钟就开始连接 我只发现了一种依赖关系,即只要有处理器内核,就有多少客户端可以快速连接 服务器代码: 班级计划{ 静态环[]args{ var loggerFactory=new loggerFactory.AddNLog; var logger=loggerFactory.CreateLogger; var tcpListener=新的TcpListenerIPAddr

我有一个服务器和一个客户端通过tcp连接。 如果同时向服务器发送多个连接请求,那么首先会快速创建多个连接,然后客户机每隔大约一秒钟就开始连接

我只发现了一种依赖关系,即只要有处理器内核,就有多少客户端可以快速连接

服务器代码:

班级计划{ 静态环[]args{ var loggerFactory=new loggerFactory.AddNLog; var logger=loggerFactory.CreateLogger; var tcpListener=新的TcpListenerIPAddress.Any,9100; 开始; var sem=新信号量lim18,18; 虽然是真的{ 等等; tcpListener .AcceptTcpClientAsync .ContinueWithasync任务=>{ logger.loginformation客户端已接受; sem.释放; }; } } } 客户端代码:

班级计划{ 静态环[]args{ var loggerFactory=new loggerFactory.AddNLog; var logger=loggerFactory.CreateLogger; var-clientCount=100; 对于int i=0;i{ var guid=guid.NewGuid; var客户端=新的TCP客户端; client.ConnectIPAddress.Loopback,9100; logger.LogInformation${guid}已连接; 线程1000000; }; } 而true{} } } 服务器日志Windows10 x64/6 cores/netcore2.2:

2019/04/24 10:59:50.270|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:50.295|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:50.296|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:50.296|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:50.297|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:50.297|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:51.252|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:52.252|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:53.252|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:54.252|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 10:59:55.252|INFO|Test.Server.Tcp.Program|Client accepted 
服务器日志Kubuntu x64/8 cores/netcore2.2

2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:42.464|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:50.937|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:17:59.941|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:18:09.943|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:18:21.446|INFO|Test.Server.Tcp.Program|Client accepted 
2019/04/24 11:18:33.449|INFO|Test.Server.Tcp.Program|Client accepted

如何加快客户端连接?

使用TaskCreationOptions处理客户端代码。LongRunning:

    class Program {
        static void Main(string[] args) {
            var loggerFactory = new LoggerFactory().AddNLog();
            var logger = loggerFactory.CreateLogger<Program>();

            var clientCount = 100;
            for (int i = 0; i < clientCount; i++) {
                var client = new TcpClient();
                client
                    .ConnectAsync(IPAddress.Loopback, 9100)
                    .ContinueWith(async task => {
                        await task;

                        logger.LogInformation("Connected");

                        await Task.Delay(1000000); // a lot of work
                    }, TaskContinuationOptions.LongRunning);
            }

            while (true) { }
        }
    }


客户端不使用异步代码的原因是什么?您可以使用TaskCreationOptions.LongRunning,但是如果有100个客户端,您将有效地创建100个线程,每个线程都在等待连接{为每个客户端连接创建线程否-它为每个客户端连接创建任务。然后由调度程序通过某种未指定的方式将这些任务调度到线程池线程来运行这些任务。我实际上不知道默认策略,但如果它实际上没有运行所有这些任务,我也不会感到惊讶即时传递LongRunning确实会为每个任务创建一个线程,尽管没有明确的文档记录这样做-在任何情况下,在这里使用都是合适的,因为您的.Sleep调用会使任务长时间运行.task.Delay不会占用线程。谢谢!发生了!但是,要小心以这种方式创建大量线程-这对tes来说是可以的ting,但实际情况并非如此。在Windows上,这些线程中的每一个都将保留1 MB的堆栈内存,总共高达1 GB。在Unix上,它的成本较低,但事实是这样的代码不可扩展。使用的代码。ConnectAsync和Task。延迟将不会受到这样的限制。非常感谢,我将接受您的建议。