2

我有一个应用程序,它使用循环调用带有一些参数的新线程,该应用程序很棒,但是当涉及到 100,000 条记录左右时,应用程序没有运行(在 CPU 和内存中 taskmgr 没有改变,因此假设程序不管用)

动作是:它运行一个函数,该函数首先收集一个数字 (X),然后创建一个从 0 到 X 的循环,在这个循环中,我们创建一个新的线程和选项,如 IsBackground (True)、Priority (Normal) 和初始化线程。在同一个函数中 Thread.Join 有一个 Do While (true),如果你可以穿过它刷新界面,中止线程,内存清理和 DoEvents!

在线程中使用 WebClient 来 OpenRead 并将所有这些保存在 Stream 中。使用 WebClient.IsBusy = False Do 虽然我们确保下载信息并继续使用 Regex.Match 进行 MatchCollection。使用 For Each 匹配并打印结果,并结束 Exit Do。

然后返回到返回一段时间的函数......

起初我认为这是因为列表框中打印的结果数量,但我得到了它并且仍然失败,而不是当它达到 100,000 条记录时,如果不是 100,800 左右。

我需要帮助,我不太了解 vb.net 中的编程,也不明白为什么。

编辑:我尝试删除 For Each 线程,检查它是否是。它已经完全出现了,但我不明白为什么当线程中的“For Each”时它甚至没有给我一个错误¿解决方案?


编辑:我发现了这个错误,但我不明白我解释:

A)-> 使用 For 0 到 4500 初始化函数,我调用一个带参数的线程并接收 50 个结果,(225000 个寄存器 <- 4500 * 50)当主体 For 到达 ~ 4000,在线程中的 MatchCollection ¿失败?我没有收到 Regex.Matches 的信息,然后被冻结。

B) --> 用 4000 到 4500 初始化函数,我调用一个带参数的线程并接收 50 个结果,(225000 个寄存器 <- 4500 * 50),仅此而已开始第一个线程(现在记住从 4000 到 4500 开始,我已收到 25000 个寄存器)程序被冻结,我检查断点并失败包含 Regex.Matches 结果的变量并尝试循环该程序被冻结的数组!

为什么?¿ 解决方案?

谢谢!!


功能1(初始化线程)

功能 1 ->

For Me.d = 0 To Pages(0) ' <-- 4500
        Dim param(1) As Object
        param(0) = "name"
        param(1) = "url/" & d
        Dim thread As New Thread(AddressOf Thread_)
        thread.IsBackground = True
        thread.Name = "name"
        thread.Priority = ThreadPriority.Normal 'ThreadPriority.Lowest
        thread.Start(param)
        Do While thread.Join(True)
            thread = Nothing
            ClearMemory()
            Application.DoEvents()
            Exit Do
        Loop
    Next d

线程函数:

Public Sub Thread_(ByVal param As Object)
    Try
        If param(0) = "name" Then
            Using Client As New WebClient
                Client.Headers("User-Agent") = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.13 (KHTML, like Gecko) Chrome/24.0.1290.1 Safari/537.13"
                Dim html As Stream = Client.OpenRead(param(1))
                Using reader As New StreamReader(html)
                    Do While wc.IsBusy = False
                        Dim ReadStr = reader.ReadToEnd
                        links = Regex.Matches(ReadStr, "coderegex", RegexOptions.Compiled + RegexOptions.RightToLeft + RegexOptions.Multiline + RegexOptions.Singleline)
                        For Each match In links
                            Registres(0) = Registres(0) + 1
                            Debug.Print("Registro: " & Registres(0) & " pág:" & PagesComplete(0))
                        Next
                        PagesComplete(0) = PagesComplete(0) + 1
                        links = Nothing
                        Client.Dispose()
                        Exit Do
                    Loop
                End Using
            End Using
        End If
    Catch ex As Exception
        Debug.Print("Error " & ex.Message)
    End Try
End Sub
4

1 回答 1

0

这部分看起来很可疑:

Do While thread.Join(True)
    thread = Nothing
    ClearMemory()
    Application.DoEvents()
    Exit Do
Loop

不应该是这样的:

thread.Join()
thread = Nothing
ClearMemory()

如果您使用的是框架 >=4,那么您可以考虑使用 Parallel.For ( MSDN )。您无需创建自己的线程,而是让框架为您处理它。

于 2013-11-19T12:19:06.837 回答