从线程访问Form1属性

时间:2011-09-26 12:33:23

标签: vb.net multithreading visual-studio threadpool

我有一个exceptionhandler函数,基本上只是将一行写入Form1上的文本框。这在正常运行时工作正常,但第二个我使用线程启动它无法访问属性的进程。没有抛出异常,但没有文本写入文本框:

Public Sub ExceptionHandler(ByVal Description As String, Optional ByVal Message As String = Nothing)
    ' Add Error To Textbox
    If Message = Nothing Then
        Form1.txtErrLog.Text += Description & vbCrLf
        Log_Error(Description)
    Else
        Form1.txtErrLog.Text += Description & " - " & Message & vbCrLf
        Log_Error(Description, Message)
    End If
    MessageBox.Show("caught")
End Sub

是否可以通过这种方式从线程访问表单的属性,或者更容易写入文本文件或类似文件并每隔10秒左右刷新文本框属性(不要认为这是一个不错的选择但是如果这是它必须做的唯一方式!)。

另外,对VB来说还是新手,所以如果我做了一些不好的做法,请告诉我!

2 个答案:

答案 0 :(得分:2)

不,您不应该从“错误”线程(即运行该组件的事件泵的线程以外的任何线程)访问任何GUI组件属性。您可以使用Control.Invoke / BeginInvoke在正确的线程上执行委托。

网上有很多这方面的教程 - 很多都是用C#中的例子编写的,但底层信息与语言无关。例如,请参阅Joe Albahari's threading tutorial

答案 1 :(得分:1)

你必须使用代表。在VB中搜索代表。

这是完成工作的代码的和平。

 Delegate Sub SetTextCallback(ByVal text As String)

Public Sub display_message(ByVal tx As String)

'prüfenob援引nötigist         如果Me.RichTextBox1.InvokeRequired那么             Dim d As New SetTextCallback(AddressOf display_message)             Me.Invoke(d,tx)         其他             tx.Trim()             Me.RichTextBox1.Text = tx         结束如果

End Sub