2010-04-27 4 views
0

나는 URL 파일에서 읽고 각각을 크롤링하는 더 많은 스레드를 만드는 꽤 긴 작업을 실행하고 실행할 백그라운드 작업자를 만들었습니다. 나는 그것을 디버깅을 통해 시도해 보았고 아무런 이유없이 백그라운드 프로세스가 조기에 끝나는 것을 발견했다. 이 문제를 일으키는 내 코드의 논리에 문제가 있습니까? 나는 의미를 갖기 위해 가능한 한 많이 시도하고 붙여 넣을 것입니다.배경 작업자가 올바르게 작동하지 않음

  While Not myreader.EndOfData 
         Try 
          currentRow = myreader.ReadFields() 
          Dim currentField As String 
          For Each currentField In currentRow 
           itemCount = itemCount + 1 
           searchItem = currentField 
           generateSearchFromFile(currentField) 
           processQuerySearch() 
          Next 
         Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException 
          Console.WriteLine(ex.Message.ToString) 
         End Try 

        End While 

코드의 첫 번째 비트는 파일에서 입력 루프이며,이 배경 노동자가하는 일입니다. 다음 코드는 백그라운드 작업자가 모든 'landingPages'를 처리 할 스레드를 만드는 위치입니다. 약 10 개의 스레드가 생성 된 후 백그라운드 작업자는이 하위를 종료하고 파일 입력 루프를 건너 뛰고 프로그램을 종료합니다. 다음과 같이 나는 배경 스레드를 만들 수

 Try 
       For Each landingPage As String In landingPages 
        pgbar.Timer1.Stop() 
        If VisitedPages.Contains(landingPage) Then 
         Continue For 
        Else 
         Dim thread = New Thread(AddressOf processQuery) 
         count = count + 1 
         thread.Name = "Worm" & count 
         thread.Start(landingPage) 
         If numThread >= 10 Then 
          For Each thread In ThreadList 
           thread.Join() 
          Next 
          numThread = 0 
          Continue For 
         Else 
          numThread = numThread + 1 
          SyncLock ThreadList 
           ThreadList.Add(thread) 
          End SyncLock 
         End If 
        End If 
        Next 

내 주요 프로그램은 다음과 같습니다

Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSearch.Click 

    isClicked = True 
    ProgressBar1.Value = 10 
    Me.BackgroundWorker1.RunWorkerAsync() 
    Timer1.Interval = 10000 
    .... 

배경은 할 일 함수가 표시되지 않습니다하지만 기본적으로 다른 클래스에서이 함수를 호출 ....

BlogDiscoverObj.start() 

이제 모든 스레드가 위 코드의 두 번째 블록에 있음을 기다리려고했습니다. 어두운 스레드 = 새 스레드 (AddressOf processQuery)카운트 = 10 + 1 카운트 thread.Name = "웜"& 카운트 thread.Start (landingPage) numThread> 대화 목록 Thread.join를() 각 스레드를 위해 그 = 10 다음 numThread = 0 계속하면 그렇지 numThread = numThread + 1 의 SyncLock 대화 목록 ThreadList.Add (스레드) 끝의 SyncLock 최종면 끝 하면 다음

들어
  Thread.Sleep(1000) 
      For Each Thread In ThreadList 
       Thread.Join() 
      Next 

희망이 명확이

또한 내 메인 스레드는 사용자가에서 다른 옵션을 선택하지 않으면 종료 백그라운드 프로세스를 기다리는이 배경이 실행이라고하지만 메인 쓰레드가 예상되는 곳에서 폼을 실행하다 주요 양식.

답변

2

메인 프로그램의 모습은 어떻습니까? 백그라운드 스레드를 시작하려고합니다. 프로그램의 전경 스레드가 더 이상 없을 때마다 백그라운드 스레드가 중지됩니다.

Main()을 종료하기 전에 시작한 스레드가 완료 될 때까지 기다려야합니다.

관련 문제