2012-10-20 24 views
2

我有一個應用程序使用循環來調用一個新的線程與一些參數,應用程序是偉大的,但是當涉及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 
+1

您的意思是X = 100,000?第一,你不能使用這麼多的線程。第二,聽起來像線程被鎖定。 – urlreader

+0

但是,當線程finalize,我放棄線程,所以主循環0到X incesize再次參數的線程,我不知道爲什麼應用程序停止在100.000寄存器,但如果刪除行「For Each 「爲了找到Regex.Match統計寄存器,他到了X完美! – Bayer

+0

嗯,我發現了這個錯誤,但我不明白:當我有一個〜100,000個寄存器時,4000個主體調用線程 - 當到達線程並使用Regex.Matches創建一個MatchCollection時,變量不會收到信息並且出錯:「評估屬性時出錯」 – Bayer

回答

0

該部分看起來suspicous:

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

不應該是這個樣子:

thread.Join() 
thread = Nothing 
ClearMemory() 

如果你使用的框架> = 4那麼你可以考慮使用的Parallel.For(MSDN)。您可以讓框架爲您處理它,而不是創建自己的線程。