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的回調執行完再繼續。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM