码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-02-06 12:41:21      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:

 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的回调执行完再继续。

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

标签:

原文地址:http://www.cnblogs.com/dy-debug/p/4276608.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!