Serial受信中にテキスト表示

タグの編集
投稿者 素人  (学生) 投稿日時 2019/6/18 10:36:23
Serialポートを使用してデータの受信を行っています。

◆実現したいこと
例えば、
受信データが"A"だった場合は、TextBox11.Text="正常"
受信データが"B"だった場合は、TextBox11.Text="異常"  と表示させたいです。

◆今の状況
Serialポートを使用してデータの受信はできました。
しかし、SerialPort1_DataReceivedイベントないで、TextBox11.Textの表示をさせようとしたところ、次のエラーが出てしまい、エラーの内容と原因が分からず困っております。

◆エラーメッセージ
System.InvalidOperationException
  HResult=0x80131509
  Message=有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'TextBox11' がアクセスされました。

◆試しているコード
   Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        If SerialPort1.IsOpen = False Then
            Return
        End If
        TextBox11.Text = "テスト中"
        Try
            Dim data As String
            data = SerialPort1.ReadExisting()

            Invoke(New Delegate_RcvDataToTextBox(AddressOf Me.RcvDataToTextBox), args)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

    End Sub
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/6/18 14:17:57
DataReceivedイベントが動作するスレッドは、UI スレッドではありません。
それぞれ別のスレッドなので、通信中にフォームのコントロールなどを
直接操作することは禁じられています。

(案1)SynchronizationContext クラスを用いて、各スレッドの処理を同期させる
https://devlights.hatenablog.com/entries/2009/03/19

(案2) Invoke/BeginInvoke メソッドを通じて、コントロールに対して処理を依頼する
https://www.atmarkit.co.jp/ait/articles/0506/17/news111.html
投稿者 素人  (学生) 投稿日時 2019/6/18 15:48:16
案2で解決することができました。
ありがとうございました。