虽然循环导致应用程序变慢?知道为什么吗?

时间:2010-01-08 11:43:47

标签: vb.net loops performance

我有一个简单的代码,用于查找文本文件,读取文本行,用分号分割字符串,然后发布结果。

完成此操作后,我创建了一个非常简单的while循环,在再次使用之前浪费了10秒....这里是代码:

Private Sub checkTemps()
    While Abort = False
        Try
            fileReader = New StreamReader(directory.Text & "currentTemp.dat")
            rawData = fileReader.ReadLine()
            fileReader.Close()
            Dim dataArray() As String
            dataArray = rawData.Split(";")
            updateOutput("1", dataArray(0), dataArray(1))
            updateOutput("2", dataArray(2), dataArray(3))
            updateOutput("3", dataArray(4), dataArray(5))
            updateOutput("4", dataArray(6), dataArray(7))
            stpWatch.Start()
            While stpWatch.Elapsed.Seconds < 10 And Abort = False
                pollInterval(stpWatch.ElapsedMilliseconds)
            End While
            stpWatch.Stop()
            stpWatch.Reset()
        Catch ex As Exception
            msgbox("oops!")
        End Try
    End While
    closeOnAbort()
End Sub

但是当它进入“浪费时间”的循环时 - 它似乎会减慢整个应用程序的速度?而我无法理解为什么!

所以有几个问题......是否有更好的方法可以做到这一切?第二 - 有人能发现问题吗?

所有其他命令似乎运行正常 - 此应用程序没有太多其他内容。我有另一个程序用值更新dat文件,这只是一个输出温度的客户端应用程序。

任何帮助都将不胜感激。

安德鲁


更多信息:

我应该解释pollInterval子做什么!

Private Delegate Sub pollIntervalDelegate(ByVal value As Integer)
Private Sub pollInterval(ByVal value As Integer)
    If Me.InvokeRequired Then
        Dim upbd As New pollIntervalDelegate(AddressOf pollInterval)
        Me.Invoke(upbd, New Object() {value})
    Else
        ProgressBar1.Value = value
    End If
End Sub

2 个答案:

答案 0 :(得分:2)

你的循环是一个非常紧凑的循环,不断调用pollInterval。这将占用应用程序,直到满足循环条件。

您应该使用Sleep方法暂停此线程所需的时间。

如果您想显示进度(根据您的更新),您可以将Sleep放入循环并一次睡眠1秒(或半秒?):

        While stpWatch.Elapsed.Seconds < 10 And Abort = False
            Sleep(1000)      <-- NOT 100% sure of the syntax here,
                                 but the time is specified in milliseconds
            pollInterval(stpWatch.ElapsedMilliseconds)
        End While

答案 1 :(得分:0)

你应该选择

System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10).TotalMilliseconds);