VB.NET被其他线程访问,而不是它被创建的线程。

10

我正在尝试将文本设置为标签Label_caller.Text = phone_number,但出现了以下错误:"System.InvalidOperationException: 跨线程操作无效: 从创建它的线程以外的线程访问控件'Label_caller'。" 我该如何解决这个问题?我如何使用关键字Me.?


1
将Label_caller标签作为参数传递给线程,以修改其文本。 - Ali Kazmi
1
可能是VB.NET跨线程操作无效的重复问题。 - J...
2
这可能是StackOverflow上最常见的问题。搜索并不难... http://stackoverflow.com/search?q=[vb.net]+Cross-thread+operation+not+valid - J...
http://msdn.microsoft.com/en-us/library/ms171728.aspx - J...
2个回答

21
在Windows中,你只能在UI线程上访问UI元素。因此,如果你需要从另一个线程访问它们,你可能需要在UI线程上调用该操作。
你需要使用以下方法来更新文本框。它会检查是否需要在主线程上调用并在需要时在UI线程上调用相同的方法。
Private Sub UpdateTextBox(ByVal phone_number As String)
    If Me.InvokeRequired Then
        Dim args() As String = {phone_number}
        Me.Invoke(New Action(Of String)(AddressOf UpdateTextBox), args)
        Return
    End IF
    Label_caller.Text = phone_number
End Sub

0

我可能回答得很晚,但在表单加载事件中添加以下代码似乎可以解决问题。

不确定这是否是完美的答案:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False

4
这实际上并没有解决问题,而只是混淆了问题,使情况变得更加糟糕… - Taegost
@Taegost 这个问题是“我该如何克服这个问题?”而不是“我该如何进行安全的跨线程调用”,因此,尽管这个答案可能不是最安全的解决方法,但它仍然是一个完全有效的答案,并且确实克服了这个问题,不应该因此被点踩,特别是因为相同的答案在一个相同的C#帖子上也通过了:https://dev59.com/GGsz5IYBdhLWcg3w3bxb#38784153 - Shayna
1
@Shayna - 这并没有解决问题,而是掩盖了它。这很可能会导致应用程序在其他方面出现故障,并且很有可能使代码的那部分无法按预期工作。这是一种可怕的做法,不应该教给新程序员作为错误解决方法。 - Taegost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接