Опрос последовательного порта и обработка данных

Я пытаюсь читать с нескольких последовательных портов от датчиков через микроконтроллеры. Каждый последовательный порт получит более 2000 измерений (каждое измерение - 7 байтов, все в шестнадцатеричном формате). И они стреляют одновременно. Прямо сейчас я опрашиваю с 4 последовательных портов. Кроме того, я перевожу каждое измерение в строку и добавляю его в Stringbuilder. Когда я закончу получать данные, они будут выведены в файл. Проблема в том, что потребление процессора очень велико - от 80 до 100%.

Я просмотрел некоторые статьи и поставил Thread.Sleep (100) в конце. Это сокращает время процессора, когда данные не поступают. Я также помещаю Thread.Sleep в конце каждого опроса, когда BytesToRead меньше 100. Это помогает только в определенной степени.

Может кто-нибудь предложить решение для опроса от последовательного порта и обработки данных, которые я получаю? Возможно добавление каждый раз, когда я получаю что-то, вызывает проблему?

//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());
            }
        }


    }

Ответы на вопрос(3)

Ваш ответ на вопрос