我有一個應用程序使用循環來調用一個新的線程與一些參數,應用程序是偉大的,但是當涉及100,000條記錄或應用程序沒有運行(在CPU和內存taskmgr不會改變,因此假定程序不工作)VB.NET應用程序凍結和不運行
的行動是: 它運行一個函數,首先收集一個數字(X),然後創建循環從0到X,在這個循環內我們按照IsBackground(True),Priority(Normal)和初始化線程創建一個新的線程和選項。 在同一個函數Thread.Join中有一個Do While(true),如果你可以交叉刷新的接口,中止線程,內存清理和DoEvents!
在線程中使用WebClient來打開讀取並將所有這些保存在Stream中。 With WebClient.IsBusy = False儘管我們確保信息已下載,然後繼續使用Regex.Match製作MatchCollection。 使用For For Each匹配並打印結果,並結束退出Do.
然後返回,告訴了一段時間後的功能...
起初我還以爲是因爲被印在列表框中的結果的數量,但我得到了它,還是失敗,而不是當它如果不是100,800左右,則達到10萬條記錄。
我需要幫助,我不知道在vb.net編程很好,不明白爲什麼。
編輯: 我試着刪除For Each的線程,檢查它是否是。 它已經完全出現了,但我不明白爲什麼它發生時,甚至在線程¿解決方案中的「For Each」時給我一個錯誤?
編輯: 我發現的bug,但我不明白我解釋:
A) - >初始化函數爲0到4500,我調用一個帶參數的線程和接收50結果,(225000個寄存器< - 4500 * 50)當主體對於到達〜4000,MatchCollection中的線程¿失敗?我沒有收到Regex.Matches的信息,然後凍結。
B) - >初始化函數對於4000到4500,我調用帶參數的線程並獲得50個結果,(225000個寄存器< - 4500 * 50),沒有更多的開始第一個線程(現在記住從4000開始到4500,我收到了25000個寄存器)程序凍結了,我檢查了斷點,並且失敗了包含Regex.Matches結果的變量,並試圖循環該數組,程序被凍結!
¿爲什麼? ¿解決方案?
謝謝!
功能1(Inicialize螺紋)
功能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?第一,你不能使用這麼多的線程。第二,聽起來像線程被鎖定。 – urlreader
但是,當線程finalize,我放棄線程,所以主循環0到X incesize再次參數的線程,我不知道爲什麼應用程序停止在100.000寄存器,但如果刪除行「For Each 「爲了找到Regex.Match統計寄存器,他到了X完美! – Bayer
嗯,我發現了這個錯誤,但我不明白:當我有一個〜100,000個寄存器時,4000個主體調用線程 - 當到達線程並使用Regex.Matches創建一個MatchCollection時,變量不會收到信息並且出錯:「評估屬性時出錯」 – Bayer