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()); } } } }
} 它工作正常,但问题在于性能 这是一个由5台设备组成的测试系统 它在10分钟内消耗服务器上95%的内存 如何优化代码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
谢谢这里的问题是,每次新的套接字连接出现时,您都在创建一个新线程,即使在基础连接关闭时也不会结束。线程过程在
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());
}
}
}
}