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的回调执行完再继续。
时间: 2024-10-27 08:31:06