私はBluetooth LE
ストリームから読み取ろうとしているFromStream
のC#async
関数を持っています。完全なパケットを非同期で読むSystem.IO.Stream.ReadAsync()
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 - この質問をご覧になれますか?ありがとうございました – liv2hak