0

別のスレッドからテキスト ボックスにアクセスするという問題を解決するために Dispatcher をどのように利用すべきかを理解するのに少し苦労しています。私が達成しようとしているのは、サーバーからデータを受信したら、スレッドをチャット ボックスに追加することです。

Public Class ChatScreen

Public client As Client

Private Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded
    client = Application.Current.Properties("Client")
    Me.Title = "ChitChat - " & client.Name

    txtMessage.Focus()

    Dim serverHandler As New ServerHandler(client.clientSocket, client.networkStream, txtChat)
End Sub

Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSend.Click
    client.SendMessage(txtMessage.Text)
End Sub

Private Sub Window_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles MyBase.KeyDown
    If e.Key = Key.Enter Then
        client.SendMessage(txtMessage.Text)
    End If
End Sub

Public Sub AppendToChat(ByVal message As String)
    txtChat.AppendText(">> " & message)
End Sub

Public Class ServerHandler

    Dim clientSocket As TcpClient
    Public networkStream As NetworkStream
    Dim thread As Thread

    Public Sub New(ByVal clientSocket As TcpClient, ByVal networkStream As NetworkStream)
        Me.clientSocket = clientSocket
        Me.networkStream = networkStream
        thread = New Thread(AddressOf ListenForServer)
        thread.Start()
    End Sub

    Public Sub ListenForServer()
        Dim bytesFrom(10024) As Byte
        Dim message As String

        While True
            networkStream.Read(bytesFrom, 0, CInt(clientSocket.ReceiveBufferSize))
            message = System.Text.Encoding.ASCII.GetString(bytesFrom)
            message = message.Substring(0, message.IndexOf("$"))

            'AppendToChat <--- This is where I would like to append the message to the text box
        End While
    End Sub
End Class

クラス終了

4

1 に答える 1

0

SynchronizationContext を使用してこれを行うことができます。このような変数に UI トレッド コンテキストを格納します。

Private syncContext As SynchronizationContext
Private Sub frmClient_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
    syncContext = AsyncOperationManager.SynchronizationContext
End Sub

このようにメイン UI スレッドで実行するプロシージャを作成します。

Private Sub AddTextBox()
    ‘Do whatever you want you are in UI thread here

End Sub

このようなUIスレッドでのバックグラウンドスレッドポストリクエストから

syncContext.Post(New SendOrPostCallback(AddressOf AddTextBox), Nothing)

引数を渡すこともできます

Private Sub AddTextBox(ByVal argument As Object)
    ‘Do whatever you want you are in UI thread here

End Sub

.....
syncContext.Post(New SendOrPostCallback(AddressOf AddTextBox), objToPass)
于 2013-01-16T12:27:33.753 に答える