1

着信TCPデータをリッスンできるクラスを実装しようとしています。私はタスクを使用してそうしようとしています。

私には2つの中心的な方法があります

    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パイプラインを呼び出してデータを送信し、受信者が応答します。この応答はありますが、現在、内で無限ループに陥っており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 に答える