2011-04-14 3 views
2

자습서를 사용하여 백그라운드 작업자를 만들었습니다. 라벨이나 진행 바를 내부에서 업데이트하는 것과 같은 기본적인 것들을 이해합니다. 이 백그라운드 작업자의 목적은 나중에 여러 다른 백그라운드 작업자가 사용하게 될 일련의 변수를 설정하는 것입니다. 내가 설정하는 변수는 6 개의 다른 목록과 다차원 배열입니다. 이 코드는 현재 배경 작업자에게 이와 비슷합니다.VB.NET 2008 배경 작업자

Private Sub My_BgWorker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles My_BgWorker.DoWork 
    For i As Integer = 0 To m_CountTo 
     ' Has the background worker be told to stop? 
     If My_BgWorker.CancellationPending Then 
      ' Set Cancel to True 
      'e.Cancel = True 
      Exit For 
     End If 
     System.Threading.Thread.Sleep(1000) ' Sleep for 1 Second 
     ' Report The progress of the Background Worker. 
     My_BgWorker.ReportProgress(CInt((i/m_CountTo) * 100)) 
     SetLabelText_ThreadSafe(Me.lbl_Status, FormatPercent(i/m_CountTo, 2)) 
    Next 
End Sub 

setlabeltext 위임이

' The delegate 
Delegate Sub SetLabelText_Delegate(ByVal [Label] As Object, ByVal [text] As String) 

' The delegates subroutine. 
Private Sub SetLabelText_ThreadSafe(ByVal [Label] As Object, ByVal [text] As String) 
    ' InvokeRequired required compares the thread ID of the calling thread to the thread ID of the creating thread. 
    ' If these threads are different, it returns true. 
    If [Label].InvokeRequired Then 
     Dim MyDelegate As New SetLabelText_Delegate(AddressOf SetLabelText_ThreadSafe) 
     Me.Invoke(MyDelegate, New Object() {[Label], [text]}) 
    Else 
     [Label].Text = [text] 
    End If 
End Sub 

이 모두 잘 작동하지만 난 내 목록을 설정하는 쉬운 방법을 알아 내려고 잃었어요처럼 보인다. 목록 중 설정 한 내 코드는 내가 일반적으로 목록에 무언가를 추가 할 persons.add을 사용이

Public Class Person 
    Public height As Integer 
    Public weight As Integer 
    Public age As Integer 
    Public sex As Integer 
    Public Sub New(ByVal height As Integer, ByVal weight As Integer, ByVal age As Integer, ByVal sex As String) 
     Me.height = height 
     Me.weight = weight 
     Me.age = age 
     Me.sex = sex 
    End Sub 
End Class 

Persons.Add(new person(180,210,28,"male")) 

처럼 보이지만 나는 안에 쉽게 주위에 내 머리를 감싸는 정말 힘든 시간을 보내고있어 backgroundworker (데이터 값의 양이 달라질 수있는) 여러 개의 다른 목록에 새 값을 추가합니다. 이 작업을 수행하는 쉬운 방법이 있습니까? 나는 이것을하기 위해 서브의 꼭대기에서 호출하는 것만으로 익숙해졌지만, 그것들은 하위 작업의 하위에서는 작동하지 않는 것처럼 보입니다.

또 다른 질문은이 작업을 수행하고 내 목록을 설정했는데 다른 백그라운드 작업자의 목록에서 데이터를 가져 오는 가장 쉬운 방법은 무엇입니까? 어떤 도움이라도 좋을 것입니다, 감사합니다!

+0

나는 누군가가 나에게 손을 줘 줄 수 있다면, 여전히 도움이 필요해, 고마워. – tye

+0

가장 큰 문제는 동기화 일 가능성이 높습니다. 목록에 동시에 액세스하려고하는 두 개 이상의 작업자 스레드가있는 경우 동기화를 처리해야합니다. 다른 한편으로는 작업자가 하나씩 실행되도록 예약 할 수 있다면 한 번에 하나의 작업자 만 특정 목록에 도달 할 수 있어야하며 아무런 문제가 없어야합니다. – DarinH

답변

0

Backgroundworker는 주로 UI를 고정하지 않고 업데이트하는 데 사용됩니다.

변수를 다른 백그라운드 작업자 스레드로 전달하는 것이 주 스레드의 역할입니다. 완성 된 runworker를 사용하여 채우기가 완료되고 목록에 액세스 할 때까지 기다릴 수 있습니다. 목록이 채워지는 동안 데이터에 액세스하려면 보고서 진행률 이벤트를 사용하여 부분적으로 채워진 목록을 읽고이를 다른 작업자 스레드에 전달하십시오.