UARTの受信スレッドからUIスレッドの内容を変更する方法として、
以下のようなコードを書いた。
private void DataReceived(object sender, SerialDataReceivedEventArgs e) { //受信処理 ... this.Invoke(new MethodInvoker(() => { /*UIスレッドでなんかする*/addValuetoGraph(); })); }
が、これだと接続したままでFormのClosingイベント内でSerialをCloseすると、
プログラムが停止する。
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (serialPort1.IsOpen == true) { serialPort1.Close(); comboBox1.Enabled = true; button1.Enabled = true; } }
解決策
受信スレッドのInvokeをBeginInvokeにする。
//brfore this.Invoke(new MethodInvoker(() => { addValuetoGraph(); })); //after this.BeginInvoke(new MethodInvoker(() => { addValuetoGraph(); }));