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# (s) { 尝试 { string[]Values=item.Split(',');//Console.WriteLine(“接收:{0}”,数据); 字符串时间=值[1]; //Console.WriteLine(“Time=“+Time”); 弦拉特; 管柱液化天然气; 串速; 字符串日期; lat=数值[3]; 液化天然气=数值[5]; 速度=数值[7]; 日期=数值[9]; 字符串NewDString=date.Substring(2,2)+date.Substring(0,2)+date.Substring(4,2); //Console.WriteLine(“IMEI=“+IMEI”); //备选选项:如果字符串是由最终用户输入的,则可以 //要根据当前区域性设置其格式: //IFormatProvider区域性=System.Threading.Thread.CurrentThread.CurrentCulture; 字符串myDate=(NewDString+time)。插入(2,“-”)。插入(5,“-”)。插入(8,“)。插入(11,“:”)。插入(14,“:”); double-latDeg=Convert.ToDouble(Convert.ToDouble(lat.ToString().Substring(0,2)); double-latMin=Convert.ToDouble(Convert.ToDouble(lat.ToString().Substring(2)); double lngDeg=Convert.ToDouble(Convert.ToDouble(lng.ToString().Substring(0,2)); double lngmin=Convert.ToDouble(Convert.ToDouble(lng.ToString().Substring(2)); 双latmap=latDeg+(latMin/60); //奥德拉特= 双lngmap=lngDeg+(lngmin/60); //如果((数学圆(latmap,3)!=数学圆(OldLat,3)&数学圆(lngmap,3)!=数学圆(OldLng,3))| | idleRecord>30) //{ 使用(SqlConnection conn=newsqlconnection(ConnStr)) { conn.Open(); 使用(SqlCommand cmd=conn.CreateCommand()) { //DbCommand还实现IDisposable //使用占位符创建命令 cmd.CommandText= “插入到T_跟踪中”+ ([IMEI]、[TrackTime]、[Longitude]、[latitude]、[speed]、[MapPoint]、[SafeAreaID]、[geofencid])+ “值(@IMEI、@TrackTime、@Longitude、@latitude、@speed、@MapPoint、@safereaid、@geofenseid)”; SqlParameter p_IMEI=新的SqlParameter(“@IMEI”,IMEI); cmd.Parameters.Add(p_IMEI); SqlParameter p_TrackTime=新的SqlParameter(“@TrackTime”,myDate); cmd.Parameters.Add(p_TrackTime); SqlParameter p_longide=新的SqlParameter(“@longide”,lngmap); cmd.Parameters.Add(p_经度); SqlParameter p_latitude=新的SqlParameter(“@latitude”,latmap); cmd.Parameters.Add(p_latitude); SqlParameter p_Speed=新SqlParameter(“@Speed”,速度); 命令参数添加(p_速度); SqlParameter p_Points=新的SqlParameter(“@MapPoint”,System.Data.SqlDbType.Udt); p_Points.UdtTypeName=“几何体”; p_Points.Value=GetGeographyFromText(“点(“+lngmap+”“+latmap+”)); 命令参数添加(p_点); SqlParameter P_Safe=新的SqlParameter(@SafeAreaID),OutsideSafeArea(latmap,lngmap)); 命令参数添加(P_安全); SqlParameter P_GeoFence=新的SqlParameter(“@GeoFenceID”,InsideDangerArea(latmap,lngmap)); cmd.Parameters.Add(P_GeoFence); //执行 cmd.ExecuteNonQuery(); } //} //否则 //idleRecord=idleRecord+1; } } catch(异常exp){WriteLog(exp.ToString(),EventLogEntryType.Error);} } } 捕获{} } } 捕获(例外情况除外) { //Console.WriteLine(“>>”+ex.ToString()); } } } }_C#_Multithreading_Tcp - Fatal编程技术网

C# (s) { 尝试 { string[]Values=item.Split(',');//Console.WriteLine(“接收:{0}”,数据); 字符串时间=值[1]; //Console.WriteLine(“Time=“+Time”); 弦拉特; 管柱液化天然气; 串速; 字符串日期; lat=数值[3]; 液化天然气=数值[5]; 速度=数值[7]; 日期=数值[9]; 字符串NewDString=date.Substring(2,2)+date.Substring(0,2)+date.Substring(4,2); //Console.WriteLine(“IMEI=“+IMEI”); //备选选项:如果字符串是由最终用户输入的,则可以 //要根据当前区域性设置其格式: //IFormatProvider区域性=System.Threading.Thread.CurrentThread.CurrentCulture; 字符串myDate=(NewDString+time)。插入(2,“-”)。插入(5,“-”)。插入(8,“)。插入(11,“:”)。插入(14,“:”); double-latDeg=Convert.ToDouble(Convert.ToDouble(lat.ToString().Substring(0,2)); double-latMin=Convert.ToDouble(Convert.ToDouble(lat.ToString().Substring(2)); double lngDeg=Convert.ToDouble(Convert.ToDouble(lng.ToString().Substring(0,2)); double lngmin=Convert.ToDouble(Convert.ToDouble(lng.ToString().Substring(2)); 双latmap=latDeg+(latMin/60); //奥德拉特= 双lngmap=lngDeg+(lngmin/60); //如果((数学圆(latmap,3)!=数学圆(OldLat,3)&数学圆(lngmap,3)!=数学圆(OldLng,3))| | idleRecord>30) //{ 使用(SqlConnection conn=newsqlconnection(ConnStr)) { conn.Open(); 使用(SqlCommand cmd=conn.CreateCommand()) { //DbCommand还实现IDisposable //使用占位符创建命令 cmd.CommandText= “插入到T_跟踪中”+ ([IMEI]、[TrackTime]、[Longitude]、[latitude]、[speed]、[MapPoint]、[SafeAreaID]、[geofencid])+ “值(@IMEI、@TrackTime、@Longitude、@latitude、@speed、@MapPoint、@safereaid、@geofenseid)”; SqlParameter p_IMEI=新的SqlParameter(“@IMEI”,IMEI); cmd.Parameters.Add(p_IMEI); SqlParameter p_TrackTime=新的SqlParameter(“@TrackTime”,myDate); cmd.Parameters.Add(p_TrackTime); SqlParameter p_longide=新的SqlParameter(“@longide”,lngmap); cmd.Parameters.Add(p_经度); SqlParameter p_latitude=新的SqlParameter(“@latitude”,latmap); cmd.Parameters.Add(p_latitude); SqlParameter p_Speed=新SqlParameter(“@Speed”,速度); 命令参数添加(p_速度); SqlParameter p_Points=新的SqlParameter(“@MapPoint”,System.Data.SqlDbType.Udt); p_Points.UdtTypeName=“几何体”; p_Points.Value=GetGeographyFromText(“点(“+lngmap+”“+latmap+”)); 命令参数添加(p_点); SqlParameter P_Safe=新的SqlParameter(@SafeAreaID),OutsideSafeArea(latmap,lngmap)); 命令参数添加(P_安全); SqlParameter P_GeoFence=新的SqlParameter(“@GeoFenceID”,InsideDangerArea(latmap,lngmap)); cmd.Parameters.Add(P_GeoFence); //执行 cmd.ExecuteNonQuery(); } //} //否则 //idleRecord=idleRecord+1; } } catch(异常exp){WriteLog(exp.ToString(),EventLogEntryType.Error);} } } 捕获{} } } 捕获(例外情况除外) { //Console.WriteLine(“>>”+ex.ToString()); } } } }

C# (s) { 尝试 { string[]Values=item.Split(',');//Console.WriteLine(“接收:{0}”,数据); 字符串时间=值[1]; //Console.WriteLine(“Time=“+Time”); 弦拉特; 管柱液化天然气; 串速; 字符串日期; lat=数值[3]; 液化天然气=数值[5]; 速度=数值[7]; 日期=数值[9]; 字符串NewDString=date.Substring(2,2)+date.Substring(0,2)+date.Substring(4,2); //Console.WriteLine(“IMEI=“+IMEI”); //备选选项:如果字符串是由最终用户输入的,则可以 //要根据当前区域性设置其格式: //IFormatProvider区域性=System.Threading.Thread.CurrentThread.CurrentCulture; 字符串myDate=(NewDString+time)。插入(2,“-”)。插入(5,“-”)。插入(8,“)。插入(11,“:”)。插入(14,“:”); double-latDeg=Convert.ToDouble(Convert.ToDouble(lat.ToString().Substring(0,2)); double-latMin=Convert.ToDouble(Convert.ToDouble(lat.ToString().Substring(2)); double lngDeg=Convert.ToDouble(Convert.ToDouble(lng.ToString().Substring(0,2)); double lngmin=Convert.ToDouble(Convert.ToDouble(lng.ToString().Substring(2)); 双latmap=latDeg+(latMin/60); //奥德拉特= 双lngmap=lngDeg+(lngmin/60); //如果((数学圆(latmap,3)!=数学圆(OldLat,3)&数学圆(lngmap,3)!=数学圆(OldLng,3))| | idleRecord>30) //{ 使用(SqlConnection conn=newsqlconnection(ConnStr)) { conn.Open(); 使用(SqlCommand cmd=conn.CreateCommand()) { //DbCommand还实现IDisposable //使用占位符创建命令 cmd.CommandText= “插入到T_跟踪中”+ ([IMEI]、[TrackTime]、[Longitude]、[latitude]、[speed]、[MapPoint]、[SafeAreaID]、[geofencid])+ “值(@IMEI、@TrackTime、@Longitude、@latitude、@speed、@MapPoint、@safereaid、@geofenseid)”; SqlParameter p_IMEI=新的SqlParameter(“@IMEI”,IMEI); cmd.Parameters.Add(p_IMEI); SqlParameter p_TrackTime=新的SqlParameter(“@TrackTime”,myDate); cmd.Parameters.Add(p_TrackTime); SqlParameter p_longide=新的SqlParameter(“@longide”,lngmap); cmd.Parameters.Add(p_经度); SqlParameter p_latitude=新的SqlParameter(“@latitude”,latmap); cmd.Parameters.Add(p_latitude); SqlParameter p_Speed=新SqlParameter(“@Speed”,速度); 命令参数添加(p_速度); SqlParameter p_Points=新的SqlParameter(“@MapPoint”,System.Data.SqlDbType.Udt); p_Points.UdtTypeName=“几何体”; p_Points.Value=GetGeographyFromText(“点(“+lngmap+”“+latmap+”)); 命令参数添加(p_点); SqlParameter P_Safe=新的SqlParameter(@SafeAreaID),OutsideSafeArea(latmap,lngmap)); 命令参数添加(P_安全); SqlParameter P_GeoFence=新的SqlParameter(“@GeoFenceID”,InsideDangerArea(latmap,lngmap)); cmd.Parameters.Add(P_GeoFence); //执行 cmd.ExecuteNonQuery(); } //} //否则 //idleRecord=idleRecord+1; } } catch(异常exp){WriteLog(exp.ToString(),EventLogEntryType.Error);} } } 捕获{} } } 捕获(例外情况除外) { //Console.WriteLine(“>>”+ex.ToString()); } } } },c#,multithreading,tcp,C#,Multithreading,Tcp,} 它工作正常,但问题在于性能 这是一个由5台设备组成的测试系统 它在10分钟内消耗服务器上95%的内存 如何优化代码 谢谢这里的问题是,每次新的套接字连接出现时,您都在创建一个新线程,即使在基础连接关闭时也不会结束。线程过程在while(true)循环中用一个catch-all异常处理程序包装,因此当套接字连接为cl时也是如此 static void Main(string[] args) { TcpListener serverSocket = new Tcp

}

它工作正常,但问题在于性能 这是一个由5台设备组成的测试系统 它在10分钟内消耗服务器上95%的内存 如何优化代码


谢谢

这里的问题是,每次新的套接字连接出现时,您都在创建一个新线程,即使在基础连接关闭时也不会结束。线程过程在
while(true)
循环中用一个catch-all异常处理程序包装,因此当套接字连接为cl时也是如此
    static void Main(string[] args)
    {
        TcpListener serverSocket = new TcpListener(8889);
        TcpClient clientSocket = default(TcpClient);
        int counter = 0;

        serverSocket.Start();
        //  Console.WriteLine(" >> " + "Server Started");

        counter = 0;
        while (true)
        {
            counter += 1;
            clientSocket = serverSocket.AcceptTcpClient();
            //  Console.WriteLine(" >> " + "Client No:" + Convert.ToString(counter) + " started!");
            handleClinet client = new handleClinet();
            client.startClient(clientSocket, Convert.ToString(counter));
        }

        clientSocket.Close();
        serverSocket.Stop();
        //   Console.WriteLine(" >> " + "exit");
        Console.ReadLine();
    }
}

//Class to handle each client request separatly
public class handleClinet
{

    static void WriteLog(string message, EventLogEntryType type)
    {

        using (EventLog eventLog = new EventLog("Application"))
        {
            eventLog.Source = "Application";
            eventLog.WriteEntry(message, type, 101, 1);
        }
    }
    static int InsideDangerArea(double Lat, double Lng)
    {

        string point = "POINT(" + Lng + "  " + Lat + ")";

        string ConnStr = "Data Source =.; Initial Catalog = GPS_Tracking;Integrated Security = True";
        using (SqlConnection conn = new SqlConnection(ConnStr))
        {
            conn.Open();
            using (SqlCommand comm = new SqlCommand("Select id from T_Geofncies", conn))
            {
                DataTable dt = new DataTable();
                dt.Load(comm.ExecuteReader());

                foreach (DataRow dr in dt.Rows)
                {
                    string Query = "  DECLARE @g geometry; DECLARE @h geometry; SET @g = (select(points) from T_Geofncies where id=" + dr["id"].ToString() + " );";
                    Query += " SET @h = geometry::STGeomFromText('" + point + "', 4326); SELECT @g.STContains(@h);";
                    comm.CommandText = Query;
                    int Val = Convert.ToInt32(comm.ExecuteScalar());
                    if (Val == 1)
                    {
                        conn.Close();
                        conn.Dispose();
                        return Convert.ToInt32(dr["id"]);
                    }

                }
            }
            conn.Close();
            conn.Dispose();
        }
        return 0;
    }

    static int OutsideSafeArea(double Lat, double Lng)
    {

        string point = "POINT(" + Lng + "  " + Lat + ")";

        string ConnStr = "Data Source =.; Initial Catalog = GPS_Tracking;Integrated Security = True";
        using (SqlConnection conn = new SqlConnection(ConnStr))
        {
            conn.Open();
            using (SqlCommand comm = new SqlCommand("Select id from T_SafeArea", conn))
            {
                DataTable dt = new DataTable();
                dt.Load(comm.ExecuteReader());

                foreach (DataRow dr in dt.Rows)
                {
                    string Query = "  DECLARE @g geometry; DECLARE @h geometry; SET @g = (select(points) from T_SafeArea where id=" + dr["id"].ToString() + " );";
                    Query += " SET @h = geometry::STGeomFromText('" + point + "', 4326); SELECT @g.STContains(@h);";
                    comm.CommandText = Query;
                    int Val = Convert.ToInt32(comm.ExecuteScalar());
                    if (Val == 1)
                    {
                        conn.Close();
                        conn.Dispose();
                        return Convert.ToInt32(dr["id"]);
                    }

                }
            }
            conn.Close();
            conn.Dispose();
        }
        return 0;
    }
    static SqlGeography GetGeographyFromText(String pText)
    {
        SqlString ss = new SqlString(pText);
        SqlChars sc = new SqlChars(ss);
        try
        {
            return SqlGeography.STPointFromText(sc, 4326);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
    TcpClient clientSocket;
    string clNo;
    public void startClient(TcpClient inClientSocket, string clineNo)
    {
        this.clientSocket = inClientSocket;
        this.clNo = clineNo;
        Thread ctThread = new Thread(doChat);
        ctThread.Start();
    }
    private void doChat()
    {
        string ConnStr = "Data Source =.; Initial Catalog = GPS_Tracking;Integrated Security = True";

        int requestCount = 0;
        // byte[] bytesFrom = new byte[10025];
        string dataFromClient = null;
        Byte[] sendBytes = null;
        string serverResponse = null;
        string rCount = null;
        requestCount = 0;

        while ((true))
        {
            try
            {
                requestCount = requestCount + 1;
                NetworkStream networkStream = clientSocket.GetStream();
                int i;
                int size = (int)clientSocket.ReceiveBufferSize;
                // Loop to receive all the data sent by the client.
                Byte[] bytes = new Byte[size];
                string data = "";
                string IMEI;
                while ((i = networkStream.Read(bytes, 0, bytes.Length)) != 0)
                {

                    try
                    {
                        data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);

                        string[] tokens = data.Split(new[] { "GPRMC" }, StringSplitOptions.None);
                        var longest = Regex.Matches(data, @"\d+").Cast<Match>().OrderByDescending(m => m.Length).First();


                        IMEI = longest.ToString();
                        if (IMEI.Length > 15)
                            IMEI = IMEI.Substring(1);



                        foreach (string item in tokens)
                        {
                            try
                            {
                                string[] Values = item.Split(',');                                   // Console.WriteLine("Received: {0}", data);
                                string time = Values[1];
                                // Console.WriteLine("Time= " + time);
                                string lat;
                                string lng;
                                string speed;
                                string date;

                                lat = Values[3];
                                lng = Values[5];
                                speed = Values[7];
                                date = Values[9];

                                string NewDString = date.Substring(2, 2) + date.Substring(0, 2) + date.Substring(4, 2);

                                //  Console.WriteLine("IMEI= " + IMEI);

                                // Alternate choice: If the string has been input by an end user, you might  
                                // want to format it according to the current culture: 
                                // IFormatProvider culture = System.Threading.Thread.CurrentThread.CurrentCulture;
                                string myDate = (NewDString + time).Insert(2, "-").Insert(5, "-").Insert(8, " ").Insert(11, ":").Insert(14, ":");


                                double latDeg = Convert.ToDouble(Convert.ToDouble(lat).ToString().Substring(0, 2));
                                double latMin = Convert.ToDouble(Convert.ToDouble(lat).ToString().Substring(2));

                                double lngDeg = Convert.ToDouble(Convert.ToDouble(lng).ToString().Substring(0, 2));
                                double lngmin = Convert.ToDouble(Convert.ToDouble(lng).ToString().Substring(2));

                                double latmap = latDeg + (latMin / 60);
                                //  OldLat=
                                double lngmap = lngDeg + (lngmin / 60);
                                //if ((Math.Round(latmap, 3) != Math.Round(OldLat, 3) && Math.Round(lngmap, 3) != Math.Round(OldLng, 3)) || idleRecord > 30)
                                //{
                                using (SqlConnection conn = new SqlConnection(ConnStr))
                                {
                                    conn.Open();
                                    using (SqlCommand cmd = conn.CreateCommand())
                                    {
                                        // DbCommand also implements IDisposable

                                        // create command with placeholders
                                        cmd.CommandText =
                                           "INSERT INTO T_Tracking " +
                                           "([IMEI], [TrackTime],  [Longitude], [Lattitude],  [speed],[MapPoint],[SafeAreaID],[GeoFenceID]) " +
                                           "VALUES(@IMEI, @TrackTime,  @Longitude, @Lattitude,  @speed,@MapPoint,@SafeAreaID,@GeoFenceID)";


                                        SqlParameter p_IMEI = new SqlParameter("@IMEI", IMEI);
                                        cmd.Parameters.Add(p_IMEI);

                                        SqlParameter p_TrackTime = new SqlParameter("@TrackTime", myDate);
                                        cmd.Parameters.Add(p_TrackTime);

                                        SqlParameter p_Longitude = new SqlParameter("@Longitude", lngmap);
                                        cmd.Parameters.Add(p_Longitude);

                                        SqlParameter p_Lattitude = new SqlParameter("@Lattitude", latmap);
                                        cmd.Parameters.Add(p_Lattitude);

                                        SqlParameter p_Speed = new SqlParameter("@speed", speed);
                                        cmd.Parameters.Add(p_Speed);
                                        SqlParameter p_Points = new SqlParameter("@MapPoint", System.Data.SqlDbType.Udt);
                                        p_Points.UdtTypeName = "geometry";
                                        p_Points.Value = GetGeographyFromText("Point(" + lngmap + "  " + latmap + ") ");
                                        cmd.Parameters.Add(p_Points);
                                        SqlParameter P_Safe = new SqlParameter("@SafeAreaID", OutsideSafeArea(latmap, lngmap));
                                        cmd.Parameters.Add(P_Safe);
                                        SqlParameter P_GeoFence = new SqlParameter("@GeoFenceID", InsideDangerArea(latmap, lngmap));
                                        cmd.Parameters.Add(P_GeoFence);
                                        // execute
                                        cmd.ExecuteNonQuery();

                                    }
                                    //}
                                    //else
                                    //    idleRecord = idleRecord + 1;

                                }
                            }
                            catch (Exception exp) { WriteLog(exp.ToString(), EventLogEntryType.Error); }
                        }


                    }
                    catch { }
                }

            }
            catch (Exception ex)
            {
                // Console.WriteLine(" >> " + ex.ToString());
            }
        }
    }
}