Evite Application.DoEvents () em c #

Muitos bons programadores (incluindo muitos bons membros do Stackoverflow) são contra o usoApplication.DoEvents() quaisquer que sejam as circunstâncias. Na verdade, é ainda suportado com muitos artigos na rede, comoeste, esse famoso debate sobre SO, ...

No entanto, estou preso em um caso em que (eu) pensoDoEvents() é a saída única (falta de experiência). Isso é o suficiente como introdução, vamos ver algumas codificações.

Eu tenho um componente 'serialPort' para conectar com um controlador através de comunicação serial, enviar comando e aguardar sua resposta, só isso.

string response = "";
bool respFlag;

private string sendCommand(string command)
{
  respFlag = false;  //initialize respFlag

  serialPort1.Write(command);  // send the command

  Stopwatch timer = Stopwatch.StartNew(); // start a timer
  while(true)
  {
    // break from the loop if receive a response
    if(respFlag) break;  

    // timeOut error if no response for more than 500msec
    if(timer.ElapsedMilliseconds >= 500) break;

    // here comes the UGLY part
    Application.DoEvents(); 
  }

   return response;
}

no método DataReceived do meu serialPort, leio a resposta existente e quebro o loop

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
  response = serialPort1.ReadExisting();

  // set the flag to true to exit the infinite loop in sendCommand
  respFlag = true; 
}

Não é exatamente assim, mas esse é um código de exemplo que mostra como eu recebo via comunicação serial. Você poderia me mostrar onde estou me forçando a entrar nessa armadilha?

questionAnswers(3)

yourAnswerToTheQuestion