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