为什么VB.NET简单的应用程序需要永远加载几行

时间:2013-02-23 07:30:20

标签: vb.net performance while-loop richtextbox lines

我有一个超级简单的脚本,用于将我们多年来从捐赠者收集的一长串电话号码分成单独的区号文件。

显然,当你有将近一百万行时,它需要一段时间 - 但是 - 如果我输入1,000,则需要不到一秒钟。一旦我投入100万,只需5秒即可完成5行。怎么会这样?

Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
    Dim lines As String
    lines = RichTextBox1.Lines.Count
    Dim looper As String = 0
    Dim path As String = "c:\acs\"
    MsgBox("I have " + lines + " lines to do.")
    If (Not System.IO.Directory.Exists(path)) Then
        System.IO.Directory.CreateDirectory(path)
    End If
    Dim i As String = 0

    For loops As Integer = 0 To RichTextBox1.Lines.Count - 1
        Dim ac As String = RichTextBox1.Lines(looper).ToString
        ac = ac.Substring(0, 3)
        Dim strFile As String = path + ac + ".txt"
        Dim sw As StreamWriter
        sw = File.AppendText(strFile)
        sw.WriteLine(RichTextBox1.Lines(looper))
        sw.Close()
        Label1.Text = String.Format("Processing item {0} of {1}", looper, lines)
        looper = looper + 1
    Next
    MsgBox("done now")
End Sub

结束班

2 个答案:

答案 0 :(得分:0)

每次使用RichTextBox.Lines属性时,VB.Net都需要通过CR + LF对分割内容。因此,您的For loops As Integer = - To RichTextBox1.Lines.Count-1确实会受到性能影响。 尝试使用:

For Each vsLine As String in RichTextBox1.Lines

代替。它会快得多。或者,如果你必须使用For循环,那么得到它一次:

Dim vasLines() As String = RichTextBox1.Lines
For viLines As Integer = 0 to UBound(vasLines.Count)
    '....
Next

代替。

答案 1 :(得分:0)

首先,您在For循环中执行UI更新。这需要时间。

您正在更新可能影响性能的主线程的线程中的UI。您不应该使用CheckForIllegalCrossThreadCalls方法。您应该使用BackgroundWorker的ReportProgress方法正确更新UI。

您正在为循环的每次迭代打开和关闭文件。这也需要时间。

我认为更好的方法是将数据添加到Dictionary(Of String,List(Of String)),区域代码作为键,列表将保存该区号的所有数字。字典填满后,循环键并写出数字。