WouldBlock传递给ReceiveAsync回调

时间:2014-11-13 16:23:21

标签: c# sockets tcp unity3d mono

我使用非阻塞发送和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。

怎么可能?

1 个答案:

答案 0 :(得分:0)

不要一起使用非阻塞和异步。这是毫无意义。异步本质上是非阻塞的,并且可以自行运行。

如果将套接字设置为非阻塞,则每次尝试接收都会立即完成。使用数据或使用SocketError.WouldBlock

坦率地说,没有.NET程序应该使用非阻塞套接字。正确使用非阻塞套接字的唯一方法是轮询套接字,并且鉴于对.NET提供的异步操作的良好支持,轮询是浪费且不必要的。