Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从另一个线程调用和访问textbox_Vb.net - Fatal编程技术网

Vb.net 从另一个线程调用和访问textbox

Vb.net 从另一个线程调用和访问textbox,vb.net,Vb.net,我在理解如何利用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

我在理解如何利用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
公共类聊天屏幕
公共客户端作为客户端
已加载的私有子窗口(ByVal sender作为System.Object,ByVal e作为System.Windows.RoutedEventArgs)处理MyBase.Loaded
client=Application.Current.Properties(“客户端”)
Me.Title=“聊天-”&client.Name
txtMessage.Focus()
Dim serverHandler作为新的serverHandler(client.clientSocket、client.networkStream、txtChat)
端接头
私有子BTN发送\单击(ByVal发送方作为System.Object,ByVal e作为System.Windows.RoutedEventArgs)处理BTN发送。单击
client.SendMessage(txtMessage.Text)
端接头
私有子窗口_KeyDown(ByVal sender作为System.Object,ByVal e作为System.Windows.Input.KeyEventArgs)处理MyBase.KeyDown
如果e.Key=Key,则输入
client.SendMessage(txtMessage.Text)
如果结束
端接头
Public Sub-AppendToChat(ByVal消息作为字符串)
txtChat.AppendText(“>>”和消息)
端接头
公共类服务器处理程序
Dim clientSocket作为TCP客户端
公共网络流作为网络流
暗线
Public Sub New(ByVal clientSocket作为TcpClient,ByVal networkStream作为networkStream)
Me.clientSocket=clientSocket
Me.networkStream=networkStream
线程=新线程(ListenForServer的地址)
thread.Start()
端接头
公共子ListenForServer()
来自(10024)的Dim字节作为字节
将消息设置为字符串
虽然是真的
networkStream.Read(bytesFrom,0,CInt(clientSocket.ReceiveBufferSize))
message=System.Text.Encoding.ASCII.GetString(bytesFrom)
message=message.Substring(0,message.IndexOf($))

'AppendToChat您可以使用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
Private Sub AddTextBox()
    ‘Do whatever you want you are in UI thread here

End Sub
syncContext.Post(New SendOrPostCallback(AddressOf AddTextBox), Nothing)
现在创建一个在主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
Private Sub AddTextBox()
    ‘Do whatever you want you are in UI thread here

End Sub
syncContext.Post(New SendOrPostCallback(AddressOf AddTextBox), Nothing)
从您的后台线程在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
Private Sub AddTextBox()
    ‘Do whatever you want you are in UI thread here

End Sub
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)