일부 매개 변수를 사용하여 루프를 사용하여 새 스레드를 호출하는 응용 프로그램이 있습니다. 응용 프로그램은 훌륭하지만 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
당신은 X = 100,000을 의미합니까? 첫째, 너무 많은 스레드를 사용할 수 없습니다. 둘째, 스레드가 잠겨있는 것처럼 들립니다. – urlreader
그러나 스레드가 종료 될 때 스레드를 중단하므로 0에서 X까지의 주요 루프가 매개 변수가있는 스레드를 다시 inicialize합니다. 이유는 응용 프로그램이 ~ 100.000 레지스터에서 중지되지만 "For Each "Regex를 찾았습니다. 레지스터를 계산하면 X에 완벽하게 도착했습니다! – Bayer
흠, 나는 버그를 발견했지만 이해가 안되요 : ~ 100,000 개의 레지스터가있을 때, 교장을 위해 4000이 스레드를 호출합니다. 스레드에 도착하여 Regex.Matches로 MatchCollection을 만들면 변수 정보를받지 못하고 오류 메시지가 표시됩니다. "속성 평가 오류" – Bayer