2

ループを使用していくつかのパラメーターを使用して新しいスレッドを呼び出すアプリケーションがあります。アプリケーションは素晴らしいですが、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
4

1 に答える 1

0

この部分は疑わしく見えます:

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

それは次のように見えるべきではありません:

thread.Join()
thread = Nothing
ClearMemory()

フレームワーク >=4 を使用している場合は、Parallel.For ( MSDN ) の使用を検討してください。独自のスレッドを作成する代わりに、フレームワークに処理させます。

于 2013-11-19T12:19:06.837 に答える