Modified relevant code. This seems to be doing the right thing.

The .Read call does not block execution, which is necessary here, so a loop is still used, but the Thread.Sleep (250) before the application.doevents seems to prevent the CPU from getting monopolized by the busy loop.

Does this make sense?
vb.net Code:
  1. If curLab.WaitForACKnowledgment Then
  2.  
  3.         tmrSend.Start()
  4.  
  5.         bElapsed = False
  6.  
  7.         sReply = ""
  8.  
  9.         If stream.CanRead Then
  10.  
  11.                  Dim lenReply As Integer, iOffset As Integer, iSize As Integer
  12.  
  13.                  iSize = 1024
  14.  
  15.                  Dim strReply(iSize) As Byte
  16.  
  17.                  Do Until bElapsed Or lenReply > 0
  18.  
  19.                          Thread.Sleep(250)
  20.  
  21.                          Application.DoEvents()
  22.  
  23.                          lenReply = stream.Read(strReply, iOffset, iSize)
  24.                          sReply = sReply & ByteArrayToString(strReply)
  25.  
  26.                          If lenReply > iSize Then
  27.                                  iOffset = iOffset + lenReply
  28.                          ElseIf lenReply > 0 And lenReply <= iSize Then
  29.                                  Exit Do
  30.                          End If
  31.  
  32.                  Loop
  33.  
  34.            End If
  35.  
  36. End If
  37.  
  38. tmrSend.Stop()
  39.  
  40. stream.Close(500)
  41.  
  42. tcp.Close()
  43.  
  44. bDataSent = True