【问题标题】:VB.NET Application Freezed and not runningVB.NET 应用程序冻结且未运行
【发布时间】:2025-11-28 14:10:01
【问题描述】:

我有一个应用程序使用循环调用带有一些参数的新线程,该应用程序很棒,但是当涉及 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 个寄存器

B) --> 使用 4000 到 4500 初始化函数,我调用一个带参数的线程并接收 50 个结果,(225000 个寄存器

¿为什么? ¿ 解决方案?

谢谢!!


函数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

【问题讨论】:

  • 您的意思是 X = 100,000?第一,你不能使用这么多线程。第二,听起来线程被锁定了。
  • 但是,当线程结束时,我中止线程,所以 0 到 X 的主循环再次用参数初始化线程,我不知道为什么应用程序停止在 ~ 100.000 个寄存器但如果删除 "For Each" 行,找到 Regex.Match 计数寄存器,他到达 X 完美!
  • 嗯,我发现了这个错误,但我不明白:当我有大约 100,000 个寄存器,4000 个用于调用线程的主体时 - 当到达线程并进行 MatchCollection使用 Regex.Matches,变量不接收信息并出现错误:“错误评估属性”
  • 你的英语很难解码,让代码来说话吧。发布一个sn-p。除此之外,使用 DoEvents 和 Thread.Abort() 是创建死锁的好方法。
  • 对不起我的英语,我编辑并放了代码。声明链接(Public links As MatchCollection)= Regex ...时,该错误在线程函数中

标签: vb.net multithreading stream webclient


【解决方案1】:

这部分看起来很可疑:

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

不应该是这样的吗:

thread.Join()
thread = Nothing
ClearMemory()

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

【讨论】: