2014-09-30 3 views
0

Его довольно простая программа. Я пытаюсь прочитать сообщения от контроллера после того, как я отправлю сообщение, которое запрашивает отправку постоянных сообщений. Первая часть - это то, как мне удалось заставить чтение работать по назначению, и каждый раз, когда отправляется сообщение, я могу видеть его в Консоли. Я хочу воссоздать этот сценарий с задачей в коде ниже. Как бы мне не удавалось это сделать.Использование задачи Async для чтения из потока, а не бесконечного цикла while

  if (success) 
      { 
       if (fileStreamDeviceData.CanRead) 
       { 
        while(success) 
        { 
         await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, outputReportBuffer.Length); 
         for (int b = 0; b < 12; b++) 
         { 
          Console.Write(outputReportBuffer[b] + " "); 
         } 
         Console.WriteLine(); 

        } 
       } 
      } 

Таким образом, вышеуказанная часть работает так, как предполагалось, за исключением уродливого бесконечного цикла while, который в настоящее время происходит. Следующие 2 части кода являются решением для этого, но не работают должным образом, и я, похоже, ничего не получаю от этого. Я действительно сосать с асинхронными задачами и прочее, поэтому, возможно, кто-то может помочь мне исправить этот раздел.

  if (success) 
      { 

       outputReportBuffer = null; 
       //start async reading 
       try 
       { 
        outputReportBuffer = await ReadByteAsync(); 
        for (int b = 0; b < outputReportBuffer.Length; b++) 
        { 
         Console.Write(outputReportBuffer[b] + " "); 
        } 
        Console.WriteLine(); 

       } 
       catch (Exception ex) 
       { 
        throw ex; 
       } 
      } 


    private async Task<Byte[]> ReadByteAsync() 
    { 
     Byte[] result = null; 
     Byte[] outputReportBuffer = null; 

     using (fileStreamDeviceData) 
     { 
      outputReportBuffer = new Byte[MyHid.Capabilities.OutputReportByteLength]; 

      int byteRead; 
      while ((byteRead = await fileStreamDeviceData.ReadAsync(outputReportBuffer, 0, outputReportBuffer.Length)) != 0) 
      { 
       result = outputReportBuffer; 
      } 

      return result; 
     } 
    } 

Я не получаю никакого исключения или никакого выхода, когда я пользуюсь этим Кодексом.

+0

Этот первый считываемый цикл является просто неправильным; вы не проверяете ** результат ** «ReadAsync» - он мог бы законно вернуть только 1 байтовую итерацию, если захочет –

+3

. Вы просто обновляете одну ссылку на буфер каждый цикл итерации, каждый раз назначая ее одному буферу. Что вы хотите делать, когда читаете что-то? –

+0

Что именно не работает? Вы не получаете никаких исключений, но печатаете ли вы что-нибудь на консоль? –

ответ

1

Я могу быть из-за многих причин, попробуйте сначала напечатать что-то внутри.

Есть ли вызывающий абонент outputReportBuffer = await ReadByteAsync(); внутри самого метода asyn? Если нет, я буду использовать ReadByteAsync().Result и установить ConfigureAwait(false) в методе ReadByteAsync().

const int BufferSize = 100; 

    private async Task<Byte[]> ReadByteAsync() 
    { 
     var memoryStream = new MemoryStream(); 

     using (fileStreamDeviceData) 
     { 
      var outputReportBuffer = new Byte[BufferSize]; 
      int offset = 0; 
      int byteRead; 

      while ((byteRead = await fileStreamDeviceData.ReadAsync(outputReportBuffer, offset, outputReportBuffer.Length)) != 0) 
      { 
       memoryStream.Write(outputReportBuffer, offset, byteRead); 
       offset += BufferSize; 
      } 

      return memoryStream.ToArray(); 
     } 
    } 
+0

да, это внутри метода асинхронной работы, и, как я уже упоминал выше, функция возвращает мне только первое и единственное первое сообщение от контроллера. –

+0

Что такое 'fileStreamDeviceData' - это поток? если это так, вы должны увеличивать смещение в цикле while –

+0

, который был недостающим. без приращения смещения i было скручено на место –

Смежные вопросы