2013-01-16 30 views
0

我在理解如何使用Dispatcher來幫助我解決從不同線程訪問文本框的問題時遇到了一些麻煩。我試圖實現的是在線程從服務器接收數據後,將線程追加到聊天框。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 

末級

回答

0

可以使用的SynchronizationContext要做到這一點, 在這樣

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 

可變Store的用戶界面胎面上下文現在創建一個過程,在這樣主UI線程執行

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

End Sub 

從你後臺線程發佈請求o ñ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) 
相關問題