我使用非阻塞发送和ReceiveAsync接收。
var r = new SocketAsyncEventArgs();
r.Completed += _receiveArgs_Completed;
r.SetBuffer(new byte[chunkSize], 0, chunkSize);
Client.Client.ReceiveAsync(r); // return value check omitted
void _receiveArgs_Completed(object sender, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.WouldBlock)
{
Console.WriteLine("Async receive would block, wtf? " + Environment.StackTrace);
return;
}
...
}
使用MS .NET,它运行正常,但在Unity(使用Mono 2.6)中,它获得了WouldBlock。
BeginReceive有效,但它有其他问题所以我想尝试ReceiveAsync。
怎么可能?
答案 0 :(得分:0)
不要一起使用非阻塞和异步。这是毫无意义。异步本质上是非阻塞的,并且可以自行运行。
如果将套接字设置为非阻塞,则每次尝试接收都会立即完成。使用数据或使用SocketError.WouldBlock
。
坦率地说,没有.NET程序应该使用非阻塞套接字。正确使用非阻塞套接字的唯一方法是轮询套接字,并且鉴于对.NET提供的异步操作的良好支持,轮询是浪费且不必要的。