1

我正在尝试实现一个可以侦听传入 TCP 数据的类。我正在尝试使用任务来做到这一点。

我有两个中心方法

    private async void ReceiveAsync()
    {
        while (true)
        {
            int bytesRead = await Receive();

            if (bytesRead > 0)
            {

                byte[] result = new byte[bytesRead];
                Buffer.BlockCopy(_buffer, 0, result, 0, bytesRead);

                Console.WriteLine(Encoding.UTF8.GetString(result));
            }
        }
    }

    private Task<int> Receive()
    {
            return Task.Run(() =>
            {
                if (sock.Poll(-1, SelectMode.SelectRead))
                    if (sock.Available > 0)
                        return sock.Receive(_buffer, _buffer.Length, SocketFlags.None);
                return -1;
            }
            );
    }

在我的主程序中,我调用ReceiveAsync()TCP 管道,然后将一些数据发送到接收器响应的 TCP 管道中。我确实收到了这个回复,但现在我陷入了一个无限循环中while(true),并且没有收到从“接收器”发送的进一步数据。

有什么完全错误的。它是什么?

4

1 回答 1

2

尝试:

int bytesRead;
do {
    bytesRead = await Receive();

    if(bytesRead > 0) {...}
} while (bytesRead > 0);

bytesRead用作退出条件。

另外:您可能可以在这里很好地使用 async :

// for illustration ONLY
TaskCompletionSource<int> source = new TaskCompletionSource<int>();
sock.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, ar =>
{
    try
    {
        int val = ((Socket)ar.AsyncState).EndReceive(ar);
        source.SetResult(val);
    }
    catch (Exception ex)
    {
        source.SetException(ex);
    }
}, sock);
return source.Task;
于 2012-10-30T16:34:47.670 回答