【问题标题】:Reading a complete packet asychronously suing System.IO.Stream.ReadAsync()异步读取完整的数据包调用 System.IO.Stream.ReadAsync()
【发布时间】:2016-12-07 21:32:04
【问题描述】:

我有一个来自 FromStream 的 C# async 函数,我正试图从 Bluetooth LE 流中读取它。

  public static async Task<MySerialPacket> FromStream(Stream stream, HashComputingFunc computeHash, IMyMessageFactory factory)
        {
            var packet = new MySerialPacket(computeHash);

            packet.m_header = await MySerialHeader.FromStream(stream, computeHash);

            var b = new byte[packet.m_header.DataLength];

            var bytes_read = await stream.ReadAsync(b, 0, packet.m_header.DataLength); 


            packet.VerifyCheckSum(b, "Data");

            var count = b[0];

            if (count > 0)
            {
                var lengths = new short[count];

                for (var i = 0; i < count; i++)
                {
                    lengths[i] = (short)(b[1 + i * 2] | b[2 + i * 2] >> 8);
                }

                var startByte = 1 + 2 * count;

                for (var i = 0; i < count; i++)
                {
                    var m = b.Skip(startByte).Take(lengths[i]).ToArray();
                    packet.Message = factory.FromBytes(m);
                }
            }

            return packet;
        }

ReadAsync 当前返回小于或等于DataLength(请求的字节数)的非零字节数。

如您所见,我需要DataLength 字节来生成格式良好的数据包。处理此问题的明智方法是什么。 C# 框架是否提供任何功能来处理这种情况。理想情况下,我更喜欢非阻塞方式。

【问题讨论】:

  • @Noseratio - 你能看看这个问题吗?非常感谢

标签: c# asynchronous bluetooth async-await bluetooth-lowenergy


【解决方案1】:

与其寻找框架函数...为什么不使用循环调用 ReadAsync 直到读取到 DataLength 字节?您只需将调用中的 0 参数更改为到目前为止已读取的总字节数。

【讨论】:

  • Y - 我认为应该有更好的方法,但我不确定。你的建议基本上是阻塞,直到你得到必要的字节。
  • 好吧,也许有更好的方法,但是在 FromStream 中多次调用 ReadAsync 不应该阻止调用 FromStream 的方法 除非您到达需要等待 FromStream 返回的 Task 的地步
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多