vb.net - 表单控件数组上的线程安全调用

标签 vb.net thread-safety controls stack-overflow

我正在尝试从单独的线程访问动态生成的控件。 但我的代码总是出现“堆​​栈溢出异常”。

我正在使用以下代码:

Private _workerThread As Threading.Thread

Private Sub Main_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    Dim Label As New Label
    Label.Name = "Label1"
    Label.Location = New System.Drawing.Point(12, 12)
    Label.Text = String.Empty
    Label.AutoSize = True

    Controls.Add(Label)

    _workerThread = New Threading.Thread(AddressOf DoWork)
    _workerThread.Priority = Threading.ThreadPriority.BelowNormal
    _workerThread.Start()
End Sub

Private Sub DoWork()
    SetLabelText("Label1", "text")
End Sub

Delegate Sub SetLabelTextCallback(ByVal LabelName As String, ByVal text As String)
Private Sub SetLabelText(ByVal LabelName As String, ByVal text As String)
    If CType(Me.Controls(LabelName), Label).InvokeRequired Then
        Dim d As New SetLabelTextCallback(AddressOf SetLabelText)
        d.Invoke(LabelName, text)
    Else
        CType(Me.Controls(LabelName), Label).Text = text
    End If
End Sub

显然 InvokeRequired 永远不会变为 False。但我不明白为什么。 也许有人可以告诉我我做错了什么。

最佳答案

您没有在 Label 的线程上调用 SetLabelTextCallback 方法,
因此你会在同一个线程上再次记忆起 InvokeRequired 永远不会是 false

Delegate Sub SetLabelTextCallback(ByVal LabelName As String, ByVal text As String) 

Private Sub SetLabelText(ByVal LabelName As String, ByVal text As String) 
    Dim l as Label = CType(Me.Controls(LabelName), Label)
    if l.InvokeRequired then
        Dim d As New SetLabelTextCallback(AddressOf SetLabelText) 
        l.Invoke(d, new Object() {LabelName, text} ) 
    Else 
        l.Text = text 
    End If 
End Sub 

关于vb.net - 表单控件数组上的线程安全调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10865408/

相关文章:

vb.net - 访问 Excel 中公开为 COM 的 .NET 函数

通过引用返回的 C++ 共享互斥锁

java - 为什么ThreadLocal不在新线程中创建?

mfc - GDI 绘图失控

vb.net - TryParse 不是 VB.NET 中 System.Enum 错误的成员

mysql - 应用分享

c# - ASP.net 中的浏览器滚动条(如何设置)

java - Thread.getStackTrace() 是线程安全的吗?

c# - 如何获得父控件的所有子项?

c# - 在 wpf 中单击鼠标时如何控制较低的 zindex?