Sondeo de puerto serie y manejo de datos

Estoy intentando leer desde varios puertos serie desde sensores a través de microcontroladores. Cada puerto serie recibirá más de 2000 mediciones (cada medición es de 7 bytes, todas en hexadecimal). Y están disparando al mismo tiempo. Ahora mismo estoy sondeando desde 4 puertos seriales. Además, traduzco cada medida en String y la agrego a un Stringbuilder. Cuando termine de recibir los datos, se enviarán a un archivo. El problema es que el consumo de CPU es muy alto, desde 80% hasta 100%.

Revisé algunos artículos y puse Thread.Sleep (100) al final. Reduce el tiempo de CPU cuando no hay datos que vienen. También coloco Thread.Sleep al final de cada sondeo cuando BytesToRead es más pequeño que 100. Solo ayuda en cierta medida.

¿Alguien puede sugerir una solución para sondear desde el puerto serie y manejar los datos que obtengo? ¿Tal vez agregar cada vez que consigo algo causa el problema?

//I use separate threads for all sensors
private void SensorThread(SerialPort mySerialPort, int bytesPerMeasurement, TextBox textBox,     StringBuilder data)
    {
        textBox.BeginInvoke(new MethodInvoker(delegate() { textBox.Text = ""; }));

        int bytesRead;
        int t;
        Byte[] dataIn;

        while (mySerialPort.IsOpen)
        {
            try
            {
                if (mySerialPort.BytesToRead != 0)
                {
                  //trying to read a fix number of bytes
                    bytesRead = 0;
                    t = 0;
                    dataIn = new Byte[bytesPerMeasurement];
                    t = mySerialPort.Read(dataIn, 0, bytesPerMeasurement);
                    bytesRead += t;
                    while (bytesRead != bytesPerMeasurement)
                    {
                        t = mySerialPort.Read(dataIn, bytesRead, bytesPerMeasurement - bytesRead);
                        bytesRead += t;
                    }
                    //convert them into hex string
                    StringBuilder s = new StringBuilder();
                    foreach (Byte b in dataIn) { s.Append(b.ToString("X") + ","); }
                    var line = s.ToString();

                                            var lineString = string.Format("{0}  ----          {2}",
                                                      line,
                                                    mySerialPort.BytesToRead);
                    data.Append(lineString + "\r\n");//append a measurement to a huge Stringbuilder...Need a solution for this.

                    ////use delegate to change UI thread...
                    textBox.BeginInvoke(new MethodInvoker(delegate() { textBox.Text = line; }));

                    if (mySerialPort.BytesToRead <= 100) { Thread.Sleep(100); }
                }
            else{Thread.Sleep(100);}

            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.ToString());
            }
        }


    }

Respuestas a la pregunta(3)

Su respuesta a la pregunta