【问题标题】:VB.net Background worker closes before loop endsVB.net 后台工作者在循环结束前关闭
【发布时间】:2018-04-13 20:00:00
【问题描述】:

我现在有一个按钮可以调用我的后台工作程序 (BackgroundWorker1),它工作正常,并且在我的 backgroundworker_DoWork 处理程序内部,它有一个 while 循环比较 2 个数字,第一个数字是 0 和第二个 255。现在,我也有一个progresschaged 处理程序,它应该在调用时更新我的​​ListView,但后台工作人员只运行循环3 次。代码如下:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim worker As System.ComponentModel.BackgroundWorker = DirectCast(sender, System.ComponentModel.BackgroundWorker)
        While startIP(1) < endIP(1) ''ONLY RUNS 3 TIMES?
            test = test + 1
            worker.ReportProgress(0, "Check")
            startIP(1) = startIP(1) + 1
        End While
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        MetroListView1.Items.Add(startIP(0) & "." & startIP(1) & "." & startIP(2) & "." & startIP(3))
        MetroListView1.Refresh()
    End Sub

    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        MessageBox.Show("Closed.")
    End Sub

我检查了这 2 个变量是否有值,它们确实有。在循环停止和 RunWorkerCompleted 处理程序运行之前,StartIP 达到 3。我真的很困惑为什么要这样做。任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • 如何声明两个数组 startIp 和 endIp?我敢打赌你这里有两个字符串数组

标签: vb.net backgroundworker


【解决方案1】:

我真的不知道有多少人被这个叫做Option Strict Off的东西所吸引
在您的项目中,此选项设置为 Off,这意味着您的编译器允许处理仅包含数字的字符串,因为它们是数字。
但在比较两个字符串时,情况并非如此。

在字符串“3”和字符串“255”之间的比较中,较小的是“255”而不是“3”,因为“255”中的第一个字符按字母顺序小于“”中的第一个(也是唯一的)字符3"。因此,当第一个字符串达到 3 的值时,您的循环结束。

这是一个使用 Option Strict Off 运行的示例

Sub Main
    Dim i As String = "0"
    Dim e As String = "255"

    While i < e
        i = i + 1
        Console.WriteLine(i)
    End While
    ' Exits when i = "3"
End Sub

您应该将两个数组(startIP 和 endIP)声明为两个整数数组,并对数字而不是字符串进行数学运算。另外,我真的建议您避免在项目属性中将 Option Strict 设置为 On 的问题

【讨论】:

  • 我已经编辑了while,以便现在将值转换为整数,但我仍然遇到同样的问题。 While Convert.ToInt32(startIP(1)) &lt; Convert.ToInt32(endIP(1)) + 1 test = test + 1 worker.ReportProgress(0, "Check") 'MessageBox.Show(startIP(0) &amp; "." &amp; startIP(1) &amp; "." &amp; startIP(2) &amp; "." &amp; startIP(3)) startIP(1) = startIP(1)) + 1 End While
  • 不确定这里还有什么。如果我将转换应用于上面的示例,则循环按预期运行 255 次。您是否能够使用调试器、在循环条件处设置断点并检查变量值?或者您可以简单地在循环内添加一个带有 startIP(1) 和 endIP(1) 值的 Console.WriteLine。您将能够通过 Visual Studio 的输出窗口(Debug->Windows->Output)看到输出
  • 我现在已经测试了console.writeline,它似乎在那里工作。所以我也必须在更新列表视图时遇到问题,因为列表视图从 60 开始,然后显示 119、176、233 和 256
  • @FUS234 如果您仍然执行“startIP(1) = startIP(1) + 1”,那么您真的应该将 startIP 声明为整数而不是字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多