ループを使用していくつかのパラメーターを使用して新しいスレッドを呼び出すアプリケーションがあります。アプリケーションは素晴らしいですが、100,000 レコードになるとアプリケーションは実行されません (CPU とメモリ内の taskmgr は変更されないため、プログラムが動かない)
アクションは次のとおりです。最初に数値 (X) を収集し、次に 0 から X までのループを作成する関数を実行します。このループ内で、IsBackground (True)、Priority (Normal)、および初期化のように、新しいスレッドとオプションを作成します。スレッド。同じ関数 Thread.Join には Do While (true) があり、更新されたインターフェイスを越えることができる場合は、スレッドを中止し、メモリをクリーンにし、DoEvents!
スレッド内で WebClient を使用して OpenRead し、これらすべてをストリームに保持します。With WebClient.IsBusy = False Do 情報がダウンロードされていることを確認し、Regex.Match を使用して MatchCollection を作成します。For Each を使用して一致結果を出力し、Exit Do を終了しました。
次に、しばらく前に通知する関数に戻ります...
最初は、リストボックスに印刷された結果の数が原因だと思っていましたが、100,800レコードではないにしても、100,000レコードに達したときではなく、取得しても失敗します。
助けが必要です。vb.net でのプログラミングがよくわからず、その理由もわかりません。
編集: For Each のスレッドを削除しようとしましたが、そうであったかどうかを確認してください。それは完全に現れましたが、スレッドで「For Each」を実行してもエラーが発生しない理由はわかりません。
編集: バグを見つけましたが、理解できません:
A) --> For 0 から 4500 で関数を初期化します。パラメーターを使用してスレッドを呼び出し、50 個の結果を受け取ります (225000 レジスター <- 4500 * 50) Regex.Matches の情報を受信できず、フリーズしました。
B) --> For 4000 to 4500 で関数を初期化します。パラメーターを使用してスレッドを呼び出し、50 個の結果を受け取ります (225000 レジスター <- 4500 * 50)。最初のスレッドを開始する必要はありません (4000 から 4500 で開始し、i 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