问题描述
|
我正在尝试在WM6 C#中创建一个非阻塞套接字,但我不断收到以下编译器错误:
\“非阻塞套接字不支持同步调用。设置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;
}
解决方法
似乎您错过了要点-您所看到的行为是设计使然。我建议阅读.NET中的异步编程(很多资源,也许从这里开始)。使用BeginXXX进行非阻塞套接字读取/写入将允许您启动发送/接收,然后执行其他操作,并在完成后(通过AsyncCallback)由内核通知,此时您将调用相应的EndXXX方法以获取结果。如果您在操作完成之前在BeginXXX调用之后立即调用EndXXX,则它被设计为阻塞直到完成。
为了获得非阻塞行为,您需要对代码进行一些分解,以正确处理回调(例如,将结果封送回UI,无论如何)。在底层内核位实际完成发送/接收多少字节之前,您将没有答案。