SocketException: 由于线程退出或应用程序请求,已放弃I/O操作" 解决方案

 1 1private static ManualResetEvent posReceiveDone = new ManualResetEvent(false);
 2 
 3 2、posThread = new Thread(delegate() { Pos(); }); posThread.Start();
 4 
 5 3public 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 4private 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的回调执行完再继续。

posted @ 2015-02-06 10:49  做梦都笑醒  阅读(22706)  评论(0编辑  收藏  举报