Вам всегда лучше избегать DataReceived
и просто использовать BaseStream
.Например:
private async void Form1_Load(object sender, EventArgs e)
{
serialPort1.Open();
using (var reader = new StreamReader(serialPort1.BaseStream)) {
while (serialPort1.IsOpen) {
string x = await reader.ReadLineAsync();
textBox2.AppendText(x + "\r\n");
}
}
}
Ключевое слово await
автоматически управляет синхронизацией обратно в поток пользовательского интерфейса - вам не нужно Invoke
, вы не получаете межпоточные сбои, вы не делаетеполучить второй вызов вашего обработчика событий, запущенного, пока первый еще работает, вы не получите условия гонки от нескольких потоков, обращающихся к одной и той же переменной.Гораздо проще разобраться.
В качестве проблемы стиля я бы не поместил этот код непосредственно в ваш обработчик событий Form Load
, я бы поместил его в вспомогательную функцию с соответствующим названием (возможно, OpenAndReadSerial()
)и назовите это переопределенным OnLoad()
.