Evite Application.DoEvents () en C #

Muchos buenos programadores (incluidos muchos buenos miembros de Stackoverflow) están en contra de usarApplication.DoEvents() Cualesquiera que sean las circunstancias. En realidad, incluso es compatible con muchos artículos en la red, comoéste, este famoso debate sobre SO, ...

Sin embargo, estoy atrapado en un caso, donde (creo)DoEvents() Es la salida única (falta de experiencia). Eso es suficiente como introducción, veamos algo de codificación.

Tengo un componente 'serialPort' para conectarme con un controlador a través de la comunicación en serie, enviar un comando y esperar su respuesta, eso es todo.

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;
}

en el método DataReceived de mi serialPort, leo la respuesta existente y rompo el ciclo

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; 
}

No es exactamente así, pero este es un código de muestra que muestra cómo recibí el sned a través de la comunicación en serie, ¿podría mostrarme amablemente dónde me estoy obligando a enfrentar esta trampa?

Respuestas a la pregunta(3)

Su respuesta a la pregunta