2011-04-18 83 views
0

我試圖創建WM6 C#非阻塞插座,但我不斷收到以下編譯器錯誤:如何創建C#Compact Framework的非阻塞套接字

「同步調用不支持非阻塞套接字。設置Blocking = true或使用異步方法。「

但是,當我使用BeginReceive()異步方法時,EndReceive()被阻止。 BeginSend()和EndSend()相同。你如何在緊湊框架中做一個無阻塞的套接字?

這是我的代碼。我沒有使用AsyncCallback方法,因爲我想返回bytesRecv和bytesSent變量。

private void asyncReceive(byte[] recvBytes, int offset, int size, SocketFlags sf) 
    { 
     IAsyncResult asyncResult = null; 
     int recvBytes = 0; 

     try 
     { 
      asyncResult = _socket.BeginSend(sendBytes, offset, size, sf, null, null); 
      recvBytes = _socket.EndSend(asyncResult); // <-- This blocks even with _socket.Blocking = false; 
     } 
     catch (SocketException) 
     { 
      //Check SocketException.ErrorCode... 
     } 

     return recvBytes; 
    } 

回答

2

看起來你錯過了點 - 你看到的行爲是設計。我建議閱讀.NET中的異步編程(大量資源 - 可能開始here)。使用BeginXXX進行非阻塞套接字讀/寫操作將允許您啓動發送/接收,然後執行其他操作,並在內核完成時通過AsyncCallback進行通知,此時您將調用相應的EndXXX方法得到結果。如果在操作完成之前立即在BeginXXX調用之後調用EndXXX,它將被設計爲阻塞直到完成。

要獲得非阻塞行爲,您需要分解一些代碼以正確處理回調(例如,將結果編組回到用戶界面,無論如何)。您將不會得到有關發送/接收多少字節的答案,直到實際由底層內核位完成爲止。

+0

這裏有一些新的東西在這裏(http://msdn.microsoft.com/en-us/vstudio/gg316360),它可以讓你編寫你的代碼,並得到你想要的行爲,但我懷疑非常感謝它將被移植到.NET Compact Framework,因爲CF看起來已經死了。 – nitzmahone 2011-04-18 23:20:05

+0

馬特是正確的:只需使用開始/結束回調。在處理套接字時,「阻塞/非阻塞」與「同步/異步」的含義不同。要在託管代碼中使用* nonblocking *套接字,您必須設置一個輪詢循環。使用套接字的最好方法是*異步阻塞*模型(其中操作本身是阻塞的,但是異步阻​​塞是通知它的完成,所以你的代碼實際上並沒有阻塞)。 – 2011-04-19 16:21:24