0

私は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#フレームワークに用意されていますか?私は理想的にはノンブロッキングな方法を好むだろう。

+0

@Noseratio - この質問をご覧になれますか?ありがとうございました – liv2hak

答えて

0

フレームワーク関数を検索する代わりに、DataLengthバイトが読み込まれるまで、ReadAsyncの呼び出しをループしないでください。今までに読み込んだ合計バイト数で、呼び出しの0パラメータを変更するだけで済みます。

+0

Y - 私は確信が持てませんが、もっと良い方法があるはずだと思います。何が示唆しているのは、必要なバイトを取得するまで、基本的にブロックしていることです。 – liv2hak

+0

さて、もっと良い方法があるかもしれませんが、** FromStream **内の** ReadAsync **へのいくつかの呼び出しは、** FromStream **を呼び出すメソッドをブロックするべきではありません。 は** FromStreamによって返されました** –

関連する問題