Application.Exit()结束程序,但线程还在的解决方法。

52 篇文章 1 订阅

出现此情况大多原因是使用了多线程编程,或者你所调用的dll使用了多线程。
我们知道,一般情况下的线程执行完指定的任务之后是会关闭了的,但是如果对于一些循环类线程,或者忘记关掉的线程时,这个时候就需要我们手动将之强制关闭。
用以下三个中的一个即可尝试强制关闭线程。

复制内容到剪贴板
代码:
Application.ExitThread();//退出当前线程上的消息循环,并关闭该线程上的所有窗口。   
复制内容到剪贴板
代码:
System.Environment.Exit(0);
//终止当前进程并为基础操作系统提供指定的退出代码
复制内容到剪贴板
代码:
Process.GetCurrentProcess().Kill();//终止当前正在运行的线程


但是这些方法都是强制关闭,那么我们如何使用Application.Exit();正常的关闭整个程序呢?
这个时候我们要引用下微软对Application.Exit();的解释了:

复制内容到剪贴板
代码:
Application.Exit();// 方法停止在所有线程上运行的所有消息循环,并关闭应用程序的所有窗口


我们看的非常清楚,停止在所有线程上运行的所有消息循环,既然是所有,那又为何关闭不掉呢?这里我们要搞清楚一点的就是,新开的进程属于另一个domain(域),你要搞清楚的是进程不等于线程,application.exit();是关闭当前进程的所有线程,不能关闭它创建的进程。新进程和本进程无任何关系。
所以,我们可以这样理解Application.Exit();

复制内容到剪贴板
代码:
Application.Exit();// 方法停止在当前进程上的所有线程上运行的所有消息循环,并关闭当前进程上的应用程序的所有窗口。

所以,我们要想在当前进程上使用Application.Exit();关闭其他进程,就要把其他的进程设置为当前进程的后台进程(IsBackground),而当在主线程中创建了一个线程时,那么该线程的IsBackground默认是设置为FALSE的。当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束。只有IsBackground=TRUE的线程才会随着主线程的退出而退出。当初始化一个线程,把Thread.IsBackground=true的时候,指示该线程为后台线程。后台线程将会随着主线程的退出而退出。


因此我们在创建完进程之后要在后面加上一句:

复制内容到剪贴板
代码:
IsBackground=true;


然后它才可以被当前进程所控制,然后才可以用Application.Exit();结束。


本文由洗白白丶首发于51cto--.Net论坛,转载请保留此段文字说明。

http://bbs.51cto.com/thread-970057-1.html

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要改协议,,高手帮下忙。。在线等。<br>using System;<br>using System.Drawing;<br>using System.Collections;<br>using System.ComponentModel;<br>using System.Windows.Forms;<br>using System.Data;<br>using System.Messaging;<br>using System.Net.Sockets;<br>using System.Text;<br>using System.Runtime.InteropServices;<br>using System.IO;<br>using System.Threading ;<br>using System.Net;<br><br>namespace GprsServer<br>{<br> /// <summary><br> /// Form1 的摘要说明。<br> /// </summary><br> public class GprsServer : System.Windows.Forms.Form<br> {<br> /// <summary><br> /// 必需的设计器变量。<br> /// </summary><br> <br> [DllImport("User32.dll",EntryPoint="SendMessage")]<br> private static extern int <br> SendMessage(<br> int hWnd, // handle to destination window<br> int Msg, // message<br> int wParam, // first message parameter<br> string lParam // second message parameter<br> );<br> [DllImport("User32.dll",EntryPoint="FindWindow")]<br> private static extern int FindWindow(string lpClassName,string lpWindowName);<br><br> [DllImport("kernel32.dll")]<br> public static extern int GetPrivateProfileString ( string section ,string key , string def , StringBuilder retVal ,int size , string filePath ) ;<br> [DllImport("kernel32")] <br> public static extern long WritePrivateProfileString ( string section,string key,string val,string filePath ) ;<br><br> private System.ComponentModel.IContainer components;<br><br> public static int LocaPort;//本地端口<br> public static string RemoteIp;<br> public static int RemotePort;//远程端口<br> public static string sCompanyName;//公司名称<br><br> private Icon m_Icon1; <br> private Icon m_Icon2;<br> private Icon m_Icon3;<br><br> private NotifyIcon notifyIcon;<br><br> MenuItem menuItem1;<br> MenuItem menuItem2;<br><br> private Hashtable CarID_RemoteIP_Hash;<br><br> private Thread thGprs ;<br> private Thread thTcpMsg ;<br> private Socket socket;<br> private Socket TcpSocket;<br><br> private System.Windows.Forms.Timer TimerIcon;<br> private System.Windows.Forms.Label lblInfo;<br> private System.Windows.Forms.Timer TimerConn;<br> private byte[] TempBuff;<br> private System.Windows.Forms.CheckBox checkBox1;<br> private System.Windows.Forms.ImageList imgList;// = new byte[1024];<br> private byte[] TcpBuff;<br> private System.Windows.Forms.ListView lvwMsg;<br> private System.Windows.Forms.ColumnHeader sId;<br> private System.Windows.Forms.ColumnHeader sNote;<br> private System.Windows.Forms.Button cmdExit;<br> private System.Windows.Forms.Button cmdSet;// = new byte[2048];<br><br> private bool bTsFlag=false;<br> public GprsServer()<br> {<br><br> InitializeComponent();<br> //检测配置文件目录是否存在<br> GetSysPra();<br><br> TempBuff= new byte[1];<br> TcpBuff=new byte[1];<br><br> m_Icon1 = new Icon("SysFile\\Icon1.ico");<br> m_Icon2 = new Icon("SysFile\\Icon2.ico"); <br> m_Icon3 = new Icon("SysFile\\Icon3.ico"); <br><br> notifyIcon = new NotifyIcon(); <br> notifyIcon.Icon = m_Icon1; <br> notifyIcon.Text = sCompanyName; <br> notifyIcon.Visible = true; <br><br> menuItem1=new MenuItem("设置"); <br> menuItem2=new MenuItem("退出"); <br><br> menuItem1.Click+=new EventHandler(this.menuItem1_Click); <br> menuItem2.Click+=new EventHandler(this.menuItem2_Click); <br><br> notifyIcon.ContextMenu=new ContextMenu(new MenuItem[]{menuItem1,menuItem2}); <br> notifyIcon.DoubleClick+=new System.EventHandler(this.notifyIcon_DBClick); <br><br> CarID_RemoteIP_Hash=new Hashtable();<br><br> thGprs = new Thread(new ThreadStart(ReadUdp)) ;<br> //启动线程<br> thGprs.IsBackground =true;//将线程作为后台线程处理,用途,当主线程关闭,子线程随着关闭<br> thGprs.Start( );<br><br> try<br> {<br> IPHostEntry IPHost = Dns.Resolve(RemoteIp);<br> string []aliases = IPHost.Aliases; <br> IPAddress []addr = IPHost.AddressList;<br> EndPoint ep = new IPEndPoint(addr[0],RemotePort); <br> TcpSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);<br> TcpSocket.Connect(ep);<br><br> thTcpMsg = new Thread (new ThreadStart(ReadTcpMsg)) ;<br> //启动线程<br> thTcpMsg.IsBackground =true;<br> thTcpMsg.Start( ) ;<br> lblInfo.Text ="系统运行正常,正在中转GPRS数据...";<br> }<br> catch<br> {}<br> }<br><br> private void GetSysPra()<br> {<br> StringBuilder temp = new StringBuilder(255);<br> if (Directory.Exists("SysIni"))<br> {<br> if (File.Exists("SysIni\\SysIni.ini"))<br> {<br> int i;<br> i= GetPrivateProfileString("PortIni","UdpPort","",temp,255,"SysIni\\SysIni.ini");<br> if (i==0)<br> {<br> LocaPort=8888;<br> WritePrivateProfileString("PortIni","UdpPort","8888","SysIni\\SysIni.ini");<br> }<br> else<br> {<br> LocaPort=int.Parse(temp.ToString( ));<br> }<br> i = GetPrivateProfileString("Company","Name","",temp,255,"SysIni\\SysIni.ini");<br> if (i==0)<br> {<br> sCompanyName="龙翰科技";<br> WritePrivateProfileString("Company","Name","龙翰科技","SysIni\\SysIni.ini");<br> }<br> else<br> {<br> sCompanyName=temp.ToString( );<br> }<br> i = GetPrivateProfileString("PortIni","TcpAddress","",temp,255,"SysIni\\SysIni.ini");<br> if (i==0)<br> {<br> RemoteIp="127.0.0.1";<br> WritePrivateProfileString("PortIni","TcpAddress","127.0.0.1","SysIni\\SysIni.ini");<br> }<br> else<br> {<br> RemoteIp=temp.ToString( );<br> }<br> i = GetPrivateProfileString("PortIni","TcpPort","",temp,255,"SysIni\\SysIni.ini");<br> if (i==0)<br> {<br> RemotePort=6666;<br> WritePrivateProfileString("PortIni","TcpPort","6666","SysIni\\SysIni.ini");<br> }<br> else<br> {<br> RemotePort=int.Parse(temp.ToString( ));<br> }<br> }<br> else<br> {<br> //File.Create("SysIni\\SysIni.ini",255);<br> LocaPort=8888;<br> WritePrivateProfileString("PortIni","UdpPort","8888","SysIni\\SysIni.ini");<br> sCompanyName="龙翰科技";<br> WritePrivateProfileString("Company","Name","龙翰科技","SysIni\\SysIni.ini");<br> RemoteIp="127.0.0.1";<br> WritePrivateProfileString("PortIni","TcpAddress","127.0.0.1","SysIni\\SysIni.ini");<br> RemotePort=6666;<br> WritePrivateProfileString("PortIni","TcpPort","6666","SysIni\\SysIni.ini");<br> }<br> }<br> else<br> {<br> Directory.CreateDirectory("SysIni");<br> //File.Create("SysIni\\SysIni.ini",255);<br> LocaPort=8888;<br> WritePrivateProfileString("PortIni","UdpPort","8888","SysIni\\SysIni.ini");<br> sCompanyName="龙翰科技";<br> WritePrivateProfileString("Company","Name","龙翰科技","SysIni\\SysIni.ini");<br> RemoteIp="127.0.0.1";<br> WritePrivateProfileString("PortIni","TcpAddress","127.0.0.1","SysIni\\SysIni.ini");<br> RemotePort=6666;<br> WritePrivateProfileString("PortIni","TcpPort","6666","SysIni\\SysIni.ini");<br> }<br> }<br> /// <summary><br> /// 清理所有正在使用的资源。<br> /// </summary><br> <br> private void menuItem1_Click(object sender,System.EventArgs e)<br> { <br> //<br> } <br> private void menuItem2_Click(object sender,System.EventArgs e)<br> { <br> this.Close(); <br> Application.Exit(); <br> } <br> private void notifyIcon_DBClick(object sender, System.EventArgs e)<br> {<br> //<br> }<br><br> protected override void Dispose( bool disposing )<br> {<br> if( disposing )<br> {<br> if (components != null) <br> {<br> components.Dispose();<br> }<br> notifyIcon.Visible =false;; <br> notifyIcon.Icon=null;<br> notifyIcon.Dispose();<br> m_Icon1.Dispose();<br> m_Icon2.Dispose();<br> m_Icon3.Dispose();<br> }<br> base.Dispose( disposing );<br> }<br><br> #region Windows 窗体设计器生成的代码<br> /// <summary><br> /// 设计器支持所需的方法 - 不要使用代码编辑器修改<br> /// 此方法的内容。<br> /// </summary><br> private void InitializeComponent()<br> {<br> this.components = new System.ComponentModel.Container();<br> System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(GprsServer));<br> this.TimerIcon = new System.Windows.Forms.Timer(this.components);<br> this.lblInfo = new System.Windows.Forms.Label();<br> this.TimerConn = new System.Windows.Forms.Timer(this.components);<br> this.lvwMsg = new System.Windows.Forms.ListView();<br> this.sId = new System.Windows.Forms.ColumnHeader();<br> this.sNote = new System.Windows.Forms.ColumnHeader();<br> this.imgList = new System.Windows.Forms.ImageList(this.components);<br> this.checkBox1 = new System.Windows.Forms.CheckBox();<br> this.cmdExit = new System.Windows.Forms.Button();<br> this.cmdSet = new System.Windows.Forms.Button();<br> this.SuspendLayout();<br> // <br> // TimerIcon<br> // <br> this.TimerIcon.Enabled = true;<br> this.TimerIcon.Interval = 1000;<br> this.TimerIcon.Tick += new System.EventHandler(this.TimerIcon_Tick);<br> // <br> // lblInfo<br> // <br> this.lblInfo.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;<br> this.lblInfo.Location = new System.Drawing.Point(4, 298);<br> this.lblInfo.Name = "lblInfo";<br> this.lblInfo.Size = new System.Drawing.Size(310, 23);<br> this.lblInfo.TabIndex = 0;<br> this.lblInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;<br> // <br> // TimerConn<br> // <br> this.TimerConn.Enabled = true;<br> this.TimerConn.Interval = 6000;<br> this.TimerConn.Tick += new System.EventHandler(this.TimerConn_Tick);<br> // <br> // lvwMsg<br> // <br> this.lvwMsg.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {<br> this.sId,<br> this.sNote});<br> this.lvwMsg.FullRowSelect = true;<br> this.lvwMsg.Location = new System.Drawing.Point(2, 2);<br> this.lvwMsg.Name = "lvwMsg";<br> this.lvwMsg.Size = new System.Drawing.Size(564, 292);<br> this.lvwMsg.SmallImageList = this.imgList;<br> this.lvwMsg.TabIndex = 1;<br> this.lvwMsg.View = System.Windows.Forms.View.Details;<br> // <br> // sId<br> // <br> this.sId.Text = "";<br> this.sId.Width = 21;<br> // <br> // sNote<br> // <br> this.sNote.Text = "消息内容";<br> this.sNote.Width = 522;<br> // <br> // imgList<br> // <br> this.imgList.ColorDepth = System.Windows.Forms.ColorDepth.Depth16Bit;<br> this.imgList.ImageSize = new System.Drawing.Size(16, 16);<br> this.imgList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgList.ImageStream")));<br> this.imgList.TransparentColor = System.Drawing.Color.Transparent;<br> // <br> // checkBox1<br> // <br> this.checkBox1.FlatStyle = System.Windows.Forms.FlatStyle.Popup;<br> this.checkBox1.Location = new System.Drawing.Point(332, 300);<br> this.checkBox1.Name = "checkBox1";<br> this.checkBox1.Size = new System.Drawing.Size(104, 19);<br> this.checkBox1.TabIndex = 2;<br> this.checkBox1.Text = "显示调试数据";<br> this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);<br> // <br> // cmdExit<br> // <br> this.cmdExit.FlatStyle = System.Windows.Forms.FlatStyle.Popup;<br> this.cmdExit.Location = new System.Drawing.Point(504, 298);<br> this.cmdExit.Name = "cmdExit";<br> this.cmdExit.Size = new System.Drawing.Size(60, 22);<br> this.cmdExit.TabIndex = 3;<br> this.cmdExit.Text = "退出(&E)";<br> this.cmdExit.Click += new System.EventHandler(this.cmdExit_Click);<br> // <br> // cmdSet<br> // <br> this.cmdSet.FlatStyle = System.Windows.Forms.FlatStyle.Popup;<br> this.cmdSet.Location = new System.Drawing.Point(432, 298);<br> this.cmdSet.Name = "cmdSet";<br> this.cmdSet.Size = new System.Drawing.Size(60, 22);<br> this.cmdSet.TabIndex = 4;<br> this.cmdSet.Text = "设置(&S)";<br> this.cmdSet.Click += new System.EventHandler(this.cmdSet_Click);<br> // <br> // GprsServer<br> // <br> this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);<br> this.ClientSize = new System.Drawing.Size(566, 323);<br> this.Controls.Add(this.cmdSet);<br> this.Controls.Add(this.cmdExit);<br> this.Controls.Add(this.checkBox1);<br> this.Controls.Add(this.lvwMsg);<br> this.Controls.Add(this.lblInfo);<br> this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;<br> this.MaximizeBox = false;<br> this.Name = "GprsServer";<br> this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;<br> this.Text = "中继服务器";<br> this.Load += new System.EventHandler(this.GprsServer_Load);<br> this.ResumeLayout(false);<br><br> }<br> #endregion<br><br> /// <summary><br> /// 应用程序的主入口点。<br> /// </summary><br> [STAThread]<br> static void Main() <br> {<br> Application.Run(new GprsServer());<br> }<br><br> private byte Get_CheckXor(ref byte[] temp,int len)<br> {<br> byte A=0;<br> for(int i=0;i<len;i++)<br> {<br> A^=temp[i];<br> }<br> return A;<br> }<br><br> private void ReadTcpMsg() //读取用户发送的指令数据<br> {<br> byte[] buff= new byte[2048];<br> string CartIpAddress="";//车辆的IP地址<br> EndPoint TempRemote = null;<br><br> int recv = 0;<br> byte[] Tbuff;<br> byte[] AllBuff;<br> int iLenght=0;<br> int iIndex=0;<br> int iLen=0;<br> int iXorValue=0;<br><br> while(true)<br> {<br> try<br> {<br> recv=TcpSocket.Receive(buff,0,TcpSocket.Available,SocketFlags.None);//读取数据内容<br> if (recv==0)<br> {<br> recv=TcpSocket.Receive(buff,0,TcpSocket.Available,SocketFlags.None);//读取数据内容<br> if (recv==0)<br> {<br> TcpSocket.Close();<br> break;<br> }<br> }<br><br> }<br> catch<br> {<br> break;<br> }<br><br> AllBuff=new byte[recv +TcpBuff.Length];<br> for (iIndex = 1; iIndex <=TcpBuff.Length; iIndex++)<br> {<br> AllBuff[iIndex-1]=TcpBuff[iIndex-1];<br> }<br><br> for (iIndex = 1; iIndex <=recv; iIndex++)<br> {<br> AllBuff[TcpBuff.Length+iIndex-1]=buff[iIndex-1];<br> }<br><br> for (iIndex = 1; iIndex <=AllBuff.Length; iIndex++)<br> {<br> iLenght=AllBuff.Length-iIndex+1;<br> if (iLenght<6)//检测数据包长度<br> {<br> //不完整,则将指令保存<br> if (iLenght>0)<br> {<br> TcpBuff=new byte[iLenght];<br> for (iLen = 1; iLen <=iLenght; iLen++)<br> {<br> TcpBuff[iLen-1]=AllBuff[iLen+iIndex-2];<br> }<br> }<br> break;<br> }<br> else<br> {<br> //检测当前指令是否是完整的指令,查找数据包头<br> if (AllBuff[iIndex-1]==0x29 & AllBuff[iIndex]==0x29)<br> {<br> if ((AllBuff.Length -iIndex)>=(AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+4))<br> {<br> //检测当前指令是否是完整的指令<br> if ((AllBuff[AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+iIndex+3])==0x0D)<br> {<br> //在接收的数据中获取单条完整的指令数据<br> Tbuff=new byte[AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+5];<br> for (iLen = 1; iLen <=Tbuff.Length; iLen++)<br> {<br> Tbuff[iLen-1]=AllBuff[iLen+iIndex-2];<br> }<br> iXorValue=Get_CheckXor(ref Tbuff,Tbuff.Length-2);<br> if(iXorValue!=Tbuff[Tbuff.Length-2])<br> {<br> //校验不合格,继续查找合法指令数据<br> continue;<br> }<br> else<br> {<br> if (bTsFlag)<br> {<br> string BuffToStr="";<br> for(int i=0;i<Tbuff.Length;i++)<br> {<br> BuffToStr+=Tbuff[i].ToString("X2")+" ";<br> }<br> ShowSysMsg(BuffToStr,2);<br> }<br> //获取车载终端手机号<br> CartIpAddress=Tbuff[5]+"." +Tbuff[6] +"."+Tbuff[7] +"."+Tbuff[8];<br> TempRemote=(EndPoint)CarID_RemoteIP_Hash[CartIpAddress];<br> if( TempRemote==null)<br> {<br> if (bTsFlag)<br> {<br> ShowSysMsg("无法查找到接收数据的远程终节点!",3);<br> }<br> }<br> else<br> {<br> try<br> {<br> socket.SendTo(Tbuff,TempRemote);<br> if (bTsFlag)<br> {<br> ShowSysMsg("数据成功转发到车载终端!",1);<br> }<br> }<br> catch<br> {<br> if (bTsFlag)<br> {<br> ShowSysMsg("数据转发到车载终端失败!",3);<br> }<br> }<br> } <br> iIndex=iIndex+Tbuff.Length-1;<br> TcpBuff=new byte[1];<br> }<br> }<br> else<br> {<br> continue;<br> }<br> }<br> else<br> {<br> if ((AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+4)>1024)<br> {<br> continue;<br> }<br> else<br> {<br> //不完整,则将指令保存<br> if (iLenght>0)<br> {<br> TcpBuff=new byte[iLenght];<br> for (iLen = 1; iLen <=iLenght; iLen++)<br> {<br> TcpBuff[iLen-1]=AllBuff[iLen+iIndex-2];<br> }<br> break;<br> }<br> else<br> {<br> TcpBuff=new byte[1];<br> break;<br> }<br><br> }<br> }<br> }<br> else<br> {<br> continue;<br> }<br> }//检测数据包长度<br> }<br> }<br> }<br><br> public void ShowSysMsg(string sNote,int iIcon)<br> {<br> //显示系统消息<br> try<br> {<br> lvwMsg.BeginUpdate();<br> if (lvwMsg.Items.Count >100)<br> lvwMsg.Items.Clear();<br> ListViewItem li = new ListViewItem();<br> //li.SubItems[0].Text =sNote ;<br> li.SubItems.Add (sNote);<br> li.ImageIndex=iIcon;<br> lvwMsg.Items.Add(li);<br> lvwMsg.EndUpdate();<br> }<br> catch<br> {}<br> }<br><br> private void ReadUdp() //从UDP数据端口读取GPRS数据<br> {<br> byte[] buff = new byte[1024];<br> int recv = 0;<br> byte[] Tbuff;<br> byte[] AllBuff;<br> int iLenght=0;<br> int iIndex=0;<br> int iLen=0;<br> int iXorValue=0;<br> string CarIpAddress="";<br> byte[] RecvAffirmBuff=new byte[]{0x29,0x29,0x21,0x00,0x05,0,0,0,0,0x0D};//回应终端数组<br><br> IPEndPoint ipep = new IPEndPoint(IPAddress.Any ,LocaPort); <br> //socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);<br> socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);<br> try<br> {<br> socket.Bind(ipep);<br> ShowSysMsg("系统成功在"+LocaPort + "端口侦听!",6);<br> }<br> catch<br> {<br> ShowSysMsg("端口"+LocaPort+"已被占用,系统侦听失败!",5);<br> return;<br> }<br> IPEndPoint sender = new IPEndPoint(IPAddress.Any , 0);//指远程终端(终节点)Ip地址对象 IPAddress.Any表示任何地址 0 表示任何端口<br> EndPoint remote = (EndPoint)(sender); //指远程终端(终节点)<br><br> while(true)<br> {<br> try<br> {<br> recv = socket.ReceiveFrom(buff , ref remote);<br> }<br> catch<br> {<br> ShowSysMsg("接收车载终端数据错误!",3);<br> }<br> //---------------------you2004-12-31 begin------------------------------//<br> AllBuff=new byte[recv +TempBuff.Length];<br> for (iIndex = 1; iIndex <=TempBuff.Length; iIndex++)<br> {<br> AllBuff[iIndex-1]=TempBuff[iIndex-1];<br> }<br><br> for (iIndex = 1; iIndex <=recv; iIndex++)<br> {<br> AllBuff[TempBuff.Length+iIndex-1]=buff[iIndex-1];<br> }<br><br> for (iIndex = 1; iIndex <=AllBuff.Length; iIndex++)<br> {<br> iLenght=AllBuff.Length-iIndex+1;<br> if (iLenght<6)//检测数据包长度<br> {<br> //不完整,则将指令保存<br> if (iLenght>0)<br> {<br> TempBuff=new byte[iLenght];<br> for (iLen = 1; iLen <=iLenght; iLen++)<br> {<br> TempBuff[iLen-1]=AllBuff[iLen+iIndex-2];<br> }<br> }<br> break;<br> }<br> else<br> {<br> //检测当前指令是否是完整的指令,查找数据包头<br> if (AllBuff[iIndex-1]==0x29 & AllBuff[iIndex]==0x29)<br> {<br> if ((AllBuff.Length -iIndex)>=(AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+4))<br> {<br> //检测当前指令是否是完整的指令<br> if ((AllBuff[AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+iIndex+3])==0x0D)<br> {<br> //在接收的数据中获取单条完整的指令数据<br> Tbuff=new byte[AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+5];<br> for (iLen = 1; iLen <=Tbuff.Length; iLen++)<br> {<br> Tbuff[iLen-1]=AllBuff[iLen+iIndex-2];<br> }<br> iXorValue=Get_CheckXor(ref Tbuff,Tbuff.Length-2);<br> if(iXorValue!=Tbuff[Tbuff.Length-2])<br> {<br> //校验不合格,继续查找合法指令数据<br> continue;<br> }<br> else<br> {<br> if (bTsFlag)<br> {<br> string BuffToStr="";<br> for(int i=0;i<Tbuff.Length;i++)<br> {<br> BuffToStr+=Tbuff[i].ToString("X2")+" ";<br> }<br> ShowSysMsg(BuffToStr,0);<br> }<br><br> //获取车载终端手机号<br> CarIpAddress=Tbuff[5]+"." +Tbuff[6] +"."+Tbuff[7] +"."+Tbuff[8];<br> <br> //-----------------检测系统哈希表是否包含此终端数据---------------------\\<br> if(CarID_RemoteIP_Hash.ContainsKey(CarIpAddress))<br> {<br> CarID_RemoteIP_Hash[CarIpAddress]=remote;//有更新<br> }<br> else<br> {<br> CarID_RemoteIP_Hash.Add(CarIpAddress,remote);//没有添加<br> }<br><br> //--------------------将数据转发到中心处理程序-----------------\\<br> if (TcpSocket.Connected)<br> {<br> try<br> {<br> TcpSocket.Send(Tbuff,0,Tbuff.Length,SocketFlags.None);<br> if (bTsFlag)<br> {<br> ShowSysMsg("数据成功转发到网络中心处理程序!",1);<br> }<br> }<br> catch<br> {<br> if (bTsFlag)<br> {<br> ShowSysMsg("数据转发到网络中心处理程序失败!",3);<br> }<br> }<br> }<br> //-------------------向终端发出0x21的接收确认-------------------\\<br> RecvAffirmBuff[5]=Tbuff[Tbuff.Length-2];<br> RecvAffirmBuff[6]=Tbuff[2];<br> RecvAffirmBuff[7]=Tbuff[9];<br> RecvAffirmBuff[8]=Get_CheckXor(ref RecvAffirmBuff,8);<br> socket.SendTo(RecvAffirmBuff,remote);<br> iIndex=iIndex+Tbuff.Length-1;<br> TempBuff=new byte[1];<br> }<br> }<br> else<br> {<br> continue;<br> }<br> }<br> else<br> {<br> if ((AllBuff[iIndex+2]*256+ AllBuff[iIndex+3]+4)>1024)<br> {<br> continue;<br> }<br> else<br> {<br> //不完整,则将指令保存<br> if (iLenght>0)<br> {<br> TempBuff=new byte[iLenght];<br> for (iLen = 1; iLen <=iLenght; iLen++)<br> {<br> TempBuff[iLen-1]=AllBuff[iLen+iIndex-2];<br> }<br> break;<br> }<br> else<br> {<br> TempBuff=new byte[1];<br> break;<br> }<br><br> }<br> }<br> }<br> else<br> {<br> continue;<br> }<br> }//检测数据包长度<br> <br> }<br> //---------------------you2004-12-31 end------------------------------//<br> }<br><br> }<br><br> private void GprsServer_Load(object sender, System.EventArgs e)<br> {<br> //<br> }<br><br> int I=0;<br> private void TimerIcon_Tick(object sender, System.EventArgs e)<br> {<br> if(thGprs!=null)<br> { <br> if(thGprs.IsAlive)<br> notifyIcon.Icon=notifyIcon.Icon==m_Icon1?m_Icon2:m_Icon1;<br> else<br> notifyIcon.Icon=notifyIcon.Icon==m_Icon1?m_Icon3:m_Icon1;<br> }<br> I++;<br> if(I>5)<br> {<br> I=FindWindow(null,@sCompanyName);<br> if( I!= 0)<br> {<br> SendMessage(I,0x501,1002,"");<br> }<br> I=0;<br> } <br> }<br><br> private void TimerConn_Tick(object sender, System.EventArgs e)<br> {<br> if (!TcpSocket.Connected)<br> {<br> try<br> {<br> lblInfo.Text ="与中心数据处理程序断开,正在进行二次连接...";<br> IPHostEntry IPHost = Dns.Resolve(RemoteIp);<br> string []aliases = IPHost.Aliases; <br> IPAddress []addr = IPHost.AddressList;<br> EndPoint ep = new IPEndPoint(addr[0],RemotePort); <br> TcpSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);<br> TcpSocket.Connect(ep);<br><br> thTcpMsg = new Thread ( new ThreadStart(ReadTcpMsg)) ;<br> //启动线程<br> thTcpMsg.IsBackground =true;<br> thTcpMsg.Start( ) ;<br> lblInfo.Text ="系统运行正常,正在中转GPRS数据...";<br> }<br> catch<br> {<br> return;<br> }<br> }<br> }<br><br> private void checkBox1_CheckedChanged(object sender, System.EventArgs e)<br> {<br> bTsFlag=checkBox1.Checked;<br> }<br><br> private void cmdExit_Click(object sender, System.EventArgs e)<br> {<br> if(MessageBox.Show("确定关闭中继服务器?", "提示",MessageBoxButtons.YesNo,MessageBoxIcon.Information) == DialogResult.Yes)<br> {<br> Application.Exit ();<br> }<br> }<br><br> private void cmdSet_Click(object sender, System.EventArgs e)<br> {<br> frmUdpSet frmudpset=new frmUdpSet();<br> frmudpset.Show();<br> }<br> <br> protected override void OnClosing(CancelEventArgs e)<br> {<br> e.Cancel =true;<br> this.WindowState =FormWindowState.Minimized;<br> }<br> }<br>}<br>
1.几种同步方法的区别 lock和Monitor是.NET用一个特殊结构实现的,Monitor对象是完全托管的、完全可移植的,并且在操作系统资源要求方 面可能更为有效,同步速度较快,但不能跨进程同步。lock(Monitor.Enter和Monitor.Exit方法的封装),主要作用是锁定临界区,使临 界区代码只能被获得锁的线程执行。Monitor.Wait和Monitor.Pulse用于线程同步,类似信号操作,个人感觉使用比较复杂,容易造成死 锁。 互斥体Mutex和事件对象EventWaitHandler属于内核对象,利用内核对象进行线程同步,线程必须要在用户模式和内核模 式间切换,所以一般效率很低,但利用互斥对象和事件对象这样的内核对象,可以在多个进程中的各个线程间进行同步。 互斥体Mutex类似于一个接力棒,拿到接力棒的线程才可以开始,当然接力棒一次只属于一个线程(Thread Affinity),如果这个线程不释放接力棒(Mutex.ReleaseMutex),那么没办法,其他所有需要接力棒运行的线程都知道能等着看热 闹。 EventWaitHandle 类允许线程通过发信号互相通信。 通常,一个或多个线程在 EventWaitHandle 上阻止,直到一个未阻止的线程调用 Set 方法,以释放一个或多个被阻止的线程。 2.什么时候需要锁定 首先要理解锁定是解决竞争条件的,也就是多个线程同时访问某个资源,造成意想不到的结果。比如,最简单的情况是,一个计数器,两个线程 同时加一,后果就是损失了一个计数,但相当频繁的锁定又可能带来性能上的消耗,还有最可怕的情况死锁。那么什么情况下我们需要使用锁,什么情况下不需要 呢? 1)只有共享资源才需要锁定 只有可以被多线程访问的共享资源才需要考虑锁定,比如静态变量,再比如某些缓存中的值,而属于线程内部的变量不需要锁定。 2)多使用lock,少用Mutex 如果你一定要使用锁定,请尽量不要使用内核模块的锁定机制,比如.NET的Mutex,Semaphore,AutoResetEvent和 ManuResetEvent,使用这样的机制涉及到了系统在用户模式和内核模式间的切换,性能差很多,但是他们的优点是可以跨进程同步线程,所以应该清 楚的了解到他们的不同和适用范围。 3)了解你的程序是怎么运行的 实际上在web开发中大多数逻辑都是在单个线程中展开的,一个请求都会在一个单独的线程中处理,其中的大部分变量都是属于这个线程的,根本没有必要考虑锁 定,当然对于ASP.NET中的Application对象中的数据,我们就要考虑加锁了。 4)把锁定交给数据库 数 据库除了存储数据之外,还有一个重要的用途就是同步,数据库本身用了一套复杂的机制来保证数据的可靠和一致性,这就为我们节省了很多的精力。保证了数据源 头上的同步,我们多数的精力就可以集中在缓存等其他一些资源的同步访问上了。通常,只有涉及到多个线程修改数据库中同一条记录时,我们才考虑加锁。 5)业务逻辑对事务和线程安全的要求 这 条是最根本的东西,开发完全线程安全的程序是件很费时费力的事情,在电子商务等涉及金融系统的案例中,许多逻辑都必须严格的线程安全,所以我们不得不牺牲 一些性能,和很多的开发时间来做这方面的工作。而一般的应用中,许多情况下虽然程序有竞争的危险,我们还是可以不使用锁定,比如有的时候计数器少一多一, 对结果无伤大雅的情况下,我们就可以不用去管它。 3.InterLocked类 Interlocked 类提供了同步对多个线程共享的变量的访问的方法。如果该变量位于共享内存中,则不同进程的线程就可以使用该机制。互锁操作是原子的,即整个操作是不能由相 同变量上的另一个互锁操作所中断的单元。这在抢先多线程操作系统中是很重要的,在这样的操作系统中,线程可以在从某个内存地址加载值之后但是在有机会更改 和存储该值之前被挂起。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值