【发布时间】:2017-12-07 21:21:56
【问题描述】:
我的主目录中有一个富文本框,我想从不同的线程中写入内容。我曾尝试使用调用来做到这一点,但我似乎无法让它工作。如果我尝试:
If InvokeRequired Then
Dim Dgate As writeLogDelegate = New writeLogDelegate(AddressOf writeLog)
BeginInvoke(Dgate, New Object() {Message})
Else
RTB_Log.AppendText(Message)
End If
然后 InvokeRequired 不会像它应该返回 true 并检查是否创建了句柄返回 false,但是在表单加载时,如果我得到 IsHandleCreated 的值,它会返回 @987654324 @。我尝试调用写作的方法是这样的:
线程类 sn-p:
Public Sub startClientPoll(ByRef Sender As TcpListener)
Dim TThread As New Thread(New ParameterizedThreadStart(AddressOf pollClientConnect))
TThread.Start(Sender)
End Sub
Private Sub pollClientConnect(tcplistener As TcpListener)
Do
If tcplistener.Pending() Then
'MessageBox.Show("")
RaiseEvent clientConnecting()
End If
Loop Until Ended = True
End Sub
事件处理类 sn-p:
Private Sub client_Connect() Handles listenerSocket.clientConnecting
Form1.writeLog("New client awaiting accept" & vbNewLine)
Dim clientSocket As TcpClient = listenerSocket.AcceptTcpClient()
Dim clientHandler As New MPClientReciever(clientSocket)
End Sub
主窗体sn-p:
Public Sub writeLog(ByVal Message As String)
If Not IsHandleCreated Then
CreateControl()
End If
If InvokeRequired Then
Dim Dgate As writeLogDelegate = New writeLogDelegate(AddressOf writeLog)
BeginInvoke(Dgate, New Object() {Message})
Else
RTB_Log.AppendText(Message)
End If
End Sub
【问题讨论】:
-
Form1.writeLog...看起来像一个默认的表单实例,不能很好地处理线程 -
如果是这样,有更好的方法吗?
-
您是否在后台线程中创建控件
CreateConrol()? -
是的,但那是因为表单似乎没有句柄,即使它在
Form1_Load中时也有。 -
默认实例是线程特定的。这意味着如果您在 UI 线程上显示默认实例,然后在辅助线程上引用默认实例,那么您实际上是在引用不同的表单。您需要引用您最初显示的实际
Form1对象,而不是在这种情况下使用默认实例。
标签: vb.net multithreading