【发布时间】: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