我試圖創建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;
}
這裏有一些新的東西在這裏(http://msdn.microsoft.com/en-us/vstudio/gg316360),它可以讓你編寫你的代碼,並得到你想要的行爲,但我懷疑非常感謝它將被移植到.NET Compact Framework,因爲CF看起來已經死了。 – nitzmahone 2011-04-18 23:20:05
馬特是正確的:只需使用開始/結束回調。在處理套接字時,「阻塞/非阻塞」與「同步/異步」的含義不同。要在託管代碼中使用* nonblocking *套接字,您必須設置一個輪詢循環。使用套接字的最好方法是*異步阻塞*模型(其中操作本身是阻塞的,但是異步阻塞是通知它的完成,所以你的代碼實際上並沒有阻塞)。 – 2011-04-19 16:21:24