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?