异步读取InputStream

时间:2016-02-21 13:37:56

标签: c# inputstream

我尝试接收数据包,如果没有接收到字节,请继续使用下面的代码。 等待ReadAsync 阻塞,直到收到新数据包。有没有办法只读取当前收到的字节?

如果我没有使用等待,则不会收到消息。

byte[] data = new byte[BufferSize];

IInputStream inputStream = socket.InputStream;
IBuffer buffer = data.AsBuffer();

socketInformation.GetStopwatchPingIdleTime().Start();

while (socketInformation.open)
{
    try
    {
        inputStream.ReadAsync(buffer, BufferSize, InputStreamOptions.Partial);
        data = buffer.ToArray();
    }
    catch (Exception)
    {
        break;
    }

    while (true)
    {
        // Wait for payload size
        if (buffer.Length >= 4)
        {
            int commandType = (int)BitConverter.ToInt16(data, 0);
            int payloadSize = (int)BitConverter.ToInt16(data, 2);
            int packetSize = PacketHeaderSize + payloadSize;

            // Wait for a full message
            if (buffer.Length >= packetSize)
            {
                byte[] packet = new byte[packetSize];
                System.Buffer.BlockCopy(data, 0, packet, 0, packetSize);

                ParsePacketSequence(socket, socketInformation, packet);

                if (buffer.Length > packetSize)
                {
                    int bufferLength = (int)buffer.Length - packetSize;

                    byte[] newData = new byte[BufferSize];
                    System.Buffer.BlockCopy(data, packetSize, newData, 0, bufferLength);
                    data = newData;

                    buffer.Length = (uint)bufferLength;
                }
                else if (buffer.Length == packetSize)
                {
                    break;
                }
                else
                {
                    break;
                }
            }
            else if (buffer.Length == packetSize)
            {
                break;
            }
        }
        else
        {
            break;
        }
    }

    if (host)
    {
        // Send ping to player
        if (socketInformation.waitingPong == false && 
            socketInformation.GetStopwatchPingIdleTime().ElapsedMilliseconds > 5000)
        {
            byte[] pingPacket = CreatePacket(6, null);
            SendPacket(socket, socketInformation, pingPacket);

            socketInformation.waitingPong = true;
        }
    }

    await Task.Delay(33, tokenSource.Token);
}

inputStream.Dispose();
socket.Dispose();
tokenSource.Cancel();

1 个答案:

答案 0 :(得分:1)

在我看来,您正在收到一串消息。当有消息时,您希望稍后或在代码中的其他位置处理它。

一个好的方法是让一个Task连续读取来自套接字的消息并将它们放入队列中。然后,您可以随时从队列中提取完整的消息。

这样你就可以摆脱这里的大部分逻辑。您永远不必中止读取请求,您永远不需要检查超时。