1 1、private static ManualResetEvent posReceiveDone = new ManualResetEvent(false); 2 3 2、posThread = new Thread(delegate() { Pos(); }); posThread.Start(); 4 5 3、public void Pos() 6 7 { 8 9 ……//填寫必要代碼 10 11 PosSocket.BeginReceive(PosMsgBuffer, 0, 2, 0, new AsyncCallback(PosReceiveCallBack), null); 12 //由於此函數是被線程調用,而線程在執行了BeginReveive后,EndReceive之前,線程資源就可能已釋放或者退出,所以要在此處等待,直到接受完數據之后,收到返回的指示時,再返回 13 posReceiveDone.WaitOne(); 14 15 } 16 17 4、private void PosReceiveCallBack(IAsyncResult AR) 18 19 { int REnd = PosSocket.EndReceive(AR); 20 21 NuberData = new byte[2]; 22 23 NuberData[0] = PosMsgBuffer[0]; 24 25 NuberData[1] = PosMsgBuffer[1]; 26 27 int s = (NuberData[0] << 8) + NuberData[1]; 28 29 Byte[] getbuffer = new Byte[s - 2]; 30 31 int i; 32 33 for (i = 0; i < getbuffer.Length; i++) 34 35 { 36 37 PosSocket.Receive(getbuffer, i, 1, SocketFlags.None); 38 39 } 40 //線程同步,指示可以返回了 41 posReceiveDone.Set(); 42 43 ……//填寫必要代碼 44 45 }
在beginreceive異步執行完成之前,讓當前線程等待他執行完posReceiveDone.waitone();回調執行玩以后 posReceiveDone.set();讓線程繼續。
如果不停止線程執行的話,他在beginreceive之后,線程因為沒有事情可做,所以就會直接結束當前線程。
因為他是異步的,所以線程不會等beginreceive的回調執行完再繼續。
