我试图创建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