別のクラスのスレッドによって受信されているメッセージで GUI のデータを更新する方法は?
サーバーからデータを受信するスレッドを持つクラスがあります。このスレッドは、サーバーからメッセージを受け取るたびにイベントを発生させます。このイベントはスターター クラス (GUI を含むメイン クラス) 内で処理されます。イベントハンドラー(たとえばDisplayData()
、他のクラスが受信したメッセージを表示する必要があります。私のコードは次のようになります
Class GUI
receiverObj = New Receiver()
Addhandler receiverObj.MessageAlert, Addressof DisplayData
...
...
Sub DisplayData()
Dim str As receiverObj.ReceiveData
lbEvents.Add.Items(str) ' lbEvents is a ListBox inside the GUI that displays messages from Receiver
End Sub
End Class
Class Receiver
Public Event MessageAlert()
Sub New ()
MyTcpClient = New TcpClient(hostIP, port)
MyTcpClient.GetStream.BeginRead(ReceiveData, 0, PacketSize, AddressOf ReceiveStream, Nothing)
End Sub
Public Sub ReceiveStream(ByVal ar As IAsyncResult)
Dim ByteCount As Integer
Try
ByteCount = MyTcpClient.GetStream.EndRead(ar)
Dim t As New Threading.Thread(Sub() RaiseEvent MessageAlert())
MyTcpClient.GetStream.BeginRead(ReceiveData, 0, PacketSize, AddressOf ReceiveStream, Nothing)
End Sub
End Class
ウィンドウがクラッシュまたはハングし、リストボックスにデータが表示されません。言って例外をスローします
クロススレッド操作が無効です: コントロール xxx は、それが作成されたスレッド以外のスレッドからアクセスされました。
誰でもこのエラーを修正する方法を提案できますか? 別のクラスのスレッドによって受信されているメッセージで GUI のデータを更新する方法は?