2012-10-20 2 views
2

일부 매개 변수를 사용하여 루프를 사용하여 새 스레드를 호출하는 응용 프로그램이 있습니다. 응용 프로그램은 훌륭하지만 10 만 레코드 정도가되면 응용 프로그램이 실행되지 않습니다 메모리 taskmgr은 변경되지 않으므로 프로그램이 작동하지 않는다고 가정하십시오.VB.NET 응용 프로그램이 고정되어 실행되지 않음

조치 : 이 루프 내에서 숫자 (X)를 먼저 수집 한 다음 0에서 X까지 루프를 만드는 기능을 실행합니다. IsBackground (True), Priority (Normal) 및 스레드 초기화와 같이 새 스레드 및 옵션을 만듭니다. 동일한 기능 Thread.Join에 Do While (true)이 있으며 인터페이스를 새로 고칠 수 있으면 스레드, 메모리 정리 및 DoEvents를 중단 할 수 있습니다.

스레드 내에서 WebClient를 OpenRead에 사용하고이 모든 것을 Stream에 보관합니다. With WebClient.IsBusy = False Do 정보를 다운로드하고 Regex.Match로 MatchCollection을 만드는 동안 계속 진행합니다. For를 각각 사용하여 결과를 일치시키고 인쇄하고 Exit Do를 끝냅니다.

그럼 내가 때문에 목록 상자에 인쇄 된 결과의 수라고 생각 처음에는

... 다시 잠시 이야기 함수에 반환하지만 나는 그것을 가지고 아직도,하지 때 실패 100,800가 아니라면 100,000 레코드에 도달합니다.

저는 도움이 필요합니다. 저는 vb.net에서 프로그래밍이 잘되어 있지 않고 이유를 이해하지 못합니다.

편집 : For Each 스레드를 제거하려고했는지 확인해보십시오. 완전히 등장했지만, 왜 스레드 "솔루션"에서 "For Each"라는 오류가 발생하지 않는지 이해할 수 없습니까?


편집 : 나는 버그를 발견,하지만 난 내가 설명을 이해하지 않습니다)

A -> 0 4500에, 내가 매개 변수를 스레드로 전화와 기능을 초기화하고 50를받을 결과, (225000 레지스터 < - 4500 * 50) Principal For가 ~ 4000에 도달하면 Thread ¿의 MatchCollection에서 실패합니까? 나는 정규 표현식의 정보를받지 못한다.

B) -> 초기화 함수와 함께 4000에서 4500까지 매개 변수가있는 스레드를 호출하고 50 개의 결과 (225000 레지스터 < - 4500 * 50)를 받으면 더 이상 첫 번째 스레드가 시작되지 않습니다. 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

그러나 스레드가 종료 될 때 스레드를 중단하므로 0에서 X까지의 주요 루프가 매개 변수가있는 스레드를 다시 inicialize합니다. 이유는 응용 프로그램이 ~ 100.000 레지스터에서 중지되지만 "For Each "Regex를 찾았습니다. 레지스터를 계산하면 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 
,745,

는 다음과 같이하지 말아야한다 :

thread.Join() 
thread = Nothing 
ClearMemory() 

당신이 사용하는 경우 프레임 워크> = 4 다음 Parallel.For (MSDN)를 사용하는 것이 좋습니다. 자신 만의 스레드를 만드는 대신 프레임 워크에서 처리하도록합니다.

관련 문제