Многие хорошие программисты (включая многих хороших участников Stackoverflow) против использования Application.DoEvents()
при любых обстоятельствах. На самом деле это даже поддерживается множеством статей в сети, например этот, эти знаменитые дебаты о SO,...
Хотя, я застрял в случае, где (я) думаю, что DoEvents()
является единственным выходом (отсутствие опыта). Этого достаточно в качестве введения, давайте посмотрим код.
У меня есть компонент «serialPort» для подключения к контроллеру через последовательную связь, отправки команды и ожидания ее ответа, вот и все.
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;
}
в методе DataReceived моего serialPort я читаю существующий ответ и разрываю цикл
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;
}
Это не совсем так, но это пример кода, который показывает, как я sned-receive через последовательную связь, не могли бы вы показать мне, где я загоняю себя в эту ловушку?
goto
поддерживается. Так же иcatch (Exception ex)
. Это не значит, что вы должны их использовать. Так что не используйтеApplication.DoEvents()
- это зло. - person Enigmativity   schedule 06.02.2015async
/await
, TPL или Rx (Reactive Framework). - person Enigmativity   schedule 06.02.2015dont use catch(exception ex)
? - person chouaib   schedule 11.02.2015catch exception
, а использовать его скорее с умом, например: в принятом ответе здесь я ДОЛЖЕН пойматьTimeOutException
. мое понимание в порядке? - person chouaib   schedule 11.02.2015TimeOutException
- это действительно исключительное событие, с которым вы можете справиться. Я не могу придумать ни одного места, где можно было бы использовать простоеcatch (Exception ex)
, за исключением, может быть, класса самого верхнего уровня. - person Enigmativity   schedule 11.02.2015