gpt4 book ai didi

vb.net - 无限循环和交叉线程

转载 作者:行者123 更新时间:2023-12-02 11:36:39 24 4
gpt4 key购买 nike

我是一名正在尝试自学 VB.NET 的学生。今天我想解决BackgroundWorker 组件。我在网上发现了一篇很棒的文章:How To Use a Background Worker 。我成功地完成了演练,甚至执行了“冒险”部分,该部分涉及使用委托(delegate)跨线程更新控件。

现在我遇到了一个我不明白它是如何工作的部分。总结以下代码,我有一个委托(delegate),其签名中有一个标签和一个字符串。然后我有一个在工作线程上调用的子例程。在这个子例程中,委托(delegate)被创建并(我猜)再次运行,以便它位于同一个(主)线程上。如果我这里错了,请纠正我。

这是在工作线程上执行的方法:

    Private Sub My_BgWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles My_BGWorker.DoWork

SetLabelText_ThreadSafe(Me.lbl_Status, FormatPercent(i / m_CountTo, 2))

End Sub

我只包含了对这个问题很重要的代码行。正如您所看到的,然后调用我提到的子例程:

    Private Sub SetLabelText_ThreadSafe(ByVal lbl As Label, ByVal txt As String)
' InvokeRequired required compares the thread ID of the calling thread to the thread ID of the creating thread.
' If these threads are different, it returns true.
If lbl.InvokeRequired Then
'WORKS: Dim MyDelegate As New SetLabelText_Delegate(AddressOf SetLabelText_ThreadSafe)
'WORKS: Me.Invoke(MyDelegate, New Object() {lbl, txt})
MyDel.Invoke(lbl, txt)
Else
lbl.Text = txt
End If
End Sub

现在,正如您所看到的,我已将代码注释掉了“WORKS”,因为它确实如此,但我很困惑为什么当 MyDel.Invoke(lbl, txt) 时它会进入无限循环 被调用是因为委托(delegate)是在主表单声明中创建的。

谢谢。

编辑:为了澄清,主窗体声明中的委托(delegate)是:

Dim MyDel As New SetLabelText_Delegate(AddressOf SetLabelText_ThreadSafe)

最佳答案

当您调用此方法时:

Private Sub SetLabelText_ThreadSafe(ByVal lbl As Label, ByVal txt As String)
If lbl.InvokeRequired Then
MyDel.Invoke(lbl, txt)

在后台线程上,发生的事情是这样的:

  • 您可以使用BackgroundWorker 在ThreadPool 线程上运行此方法
  • 该方法调用 lbl.InvokeRequired,这是 True,因为这不是 UI 线程
  • 该方法然后调用 Delegate.Invoke,后者执行委托(delegate)。这有效地调用了该方法
  • 该方法现在正在运行,但仍在非 UI 线程上,因此它立即发现 lbl.InvokeRequired 为 true,并调用 Delegate.Invoke - 创建无限循环

但是,当您调用 Me.Invoke 时,情况有点不同。在这种情况下,Me 是表单,因此您正在调用 Control.Invoke ,它将回调编码(marshal)回 UI 线程。然后它会运行,但此时它将在 UI 线程上运行,因此 lbl.InvokeRequired 将为 False,并且它只会运行一次而不是走向无限。

关于vb.net - 无限循环和交叉线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6445441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com