Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.OutOfMemoryException';晚上10点以后我被解雇了。我不能捕捉到实际的错误_C#_Multithreading_Sockets_Tcpclient - Fatal编程技术网

C# System.OutOfMemoryException';晚上10点以后我被解雇了。我不能捕捉到实际的错误

C# System.OutOfMemoryException';晚上10点以后我被解雇了。我不能捕捉到实际的错误,c#,multithreading,sockets,tcpclient,C#,Multithreading,Sockets,Tcpclient,在服务器上安装了以下软件: Windows Server 2012,SQL Server Symentec防病毒软件 基于Nginx、mssqlserver数据库的指纹阅读器 我找不到错误。线程抛出系统错误。Outofmemory和服务器有6GB的可用内存。一个套接字接收的最大数据小于4kb class ServerModule { TcpListener serverSocket; public void StartServer() { serverS

在服务器上安装了以下软件:

  • Windows Server 2012,SQL Server
  • Symentec防病毒软件
  • 基于Nginx、mssqlserver数据库的指纹阅读器
  • 我找不到错误。线程抛出系统错误。Outofmemory和服务器有6GB的可用内存。一个套接字接收的最大数据小于4kb

    class ServerModule
    {
        TcpListener serverSocket;
    
        public void StartServer()
        {
            serverSocket.Start();
            while (true)
            {
                try
                {
                    if (cmd == -1)
                    {
                        break;// stop loop
                    }
                    Console.WriteLine("Listening");
                    TcpClient tc= serverSocket.AcceptTcpClient();
                    System.Threading.Thread obj_thread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ProcessData));
                    obj_thread.Start(tc);
                }
                catch (Exception ex)
                {
                    ErrorLogger.LogError("StartServer::", ex);
                }
            }
        }
    
        public void ProcessData(object ob)
        {
            TcpClient tcp_socket = (TcpClient)ob;
            NetworkStream ns = null;
            try
            {
                ns = tcp_socket.GetStream();
                int num = 0;
                byte[] obj_data = new byte[tcp_socket.ReceiveBufferSize];
                num = ns.Read(obj_data, 0, tcp_socket.ReceiveBufferSize);
                tcp_socket.Close();
                tcp_socket = null;
            }
            catch (Exception ex)
            {
                ErrorLogger.LogError("ProcessData::", data_from_device, ex);
                if (tcp_socket != null)
                {
                    tcp_socket.Close();
                    tcp_socket = null;
                }
                Console.WriteLine("Close with exception");
            }
        } 
    }
    

    您的代码正在抛出
    OutOfMemoryException
    ,因为其中创建了许多线程。看:

    // in a infinite loop
    while (true)
    {
        ...
        // for each TcpClient
        TcpClient tc= serverSocket.AcceptTcpClient();
        // you create a thread!
        System.Threading.Thread obj_thread = new System.Threading.Thread
    }
    
    这是代码中最糟糕的事情。由于大量线程同时尝试侦听
    tcpclient
    ,因此应用程序将处于饥饿状态。应用程序中建议的线程数等于服务器机器上的内核数()

    您真的应该使用一些线程池,要么是您自己编写的(我个人不推荐),要么是已经内置的()

    如果您使用的是.NET 4.5,请使用简化代码。
    目前,您的应用程序不稳定且容易出错

    如果出于某种原因,您仍然认为每次调用
    TcpClient
    时都必须创建
    线程(我认为这是完全错误的),那么您应该阅读本手册:


    您无需等待它崩溃后才发现内存泄漏。你可以将一个内存配置文件连接到你的应用程序上并进行练习,你应该能够在它因内存不足异常而崩溃之前找到泄漏途径。问题中的代码实际上并不处理数据。它获取流,分配缓冲区,将字节复制到缓冲区,然后将其留给垃圾收集器稍后收集。您是否删除了代码/简化了示例?我必须记录来自900多个gps/gprs设备的数据。线程原因:在数据保存之前,对数据进行分析和处理,这需要时间。所以每次套接字接受时,都会有一个线程。是创建的。工作线程不需要花费太多时间0.20-1毫秒。线程池将降低整个系统的速度。我需要升级RAM吗。目前它运行良好,400个gps设备发送数据,处理器为2%。所有参数都是稳定的。您是否使用ADPool来测量性能?你重复使用线程了吗?如果
    No
    是任何问题的答案,您应该进一步调查您的问题。现在您的系统有太多线程无法同时处理。要尝试线程池,将向池传递套接字。我会通知您线程池已解决问题,服务器运行正常,问题已解决。谢谢