2011-04-18 81 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