2011-09-26 4 views
1

BackgroundWorker에서 클래스 메서드를 실행하는 Windows 양식 응용 프로그램이 있습니다.진행률 변경 이벤트를 진행률 막대에 연결하는 방법

진행률을 표시하는 진행률 표시 줄 창을 추가하고 싶습니다. 나는 현재의 비율과 형태의 이벤트를

를 보낼 각 루프를 싶습니다 그래서 클래스 메소드의

은 내가 foreach 루프가있다.

public partial class Form1 : Form 
    { 
     Parsser inst; 

     public Form1() 
     { 
      InitializeComponent(); 
      inst = new Parsser(); 
      backgroundWorker1.WorkerReportsProgress = true; 
      backgroundWorker1.WorkerSupportsCancellation = true; 
     } 


     private void button2_Click(object sender, EventArgs e) 
     { 
      if (this.textBox1 != null & this.textBox2 != null) 
      { 
       if (backgroundWorker1.IsBusy != true) 
       { 
        // Start the asynchronous operation. 
        backgroundWorker1.RunWorkerAsync(); 
       } 
      } 
     } 



     private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      inst.init(this.textBox1.Text, this.textBox2.Text); 

      inst.ParseTheFile(); 
      System.Windows.Forms.MessageBox.Show("Parsing finish successfully"); 

     } 
     private void backgroundWorker1_ProgressChanged(object sender,    ProgressChangedEventArgs e) 
     { 
      this.progressBar1.Value = e.ProgressPercentage; 
     } 

    } 


} 

`

을하고 수업 시간에 내가이 일 어떤 생각을 해달라고 몇 가지 이유에서 this-

public Parsser() 
    { 
     bgReports = new BackgroundWorker(); 
     bgReports.WorkerReportsProgress = true; 
    } 

    public void ParseTheFile() 
    { 
     Lines = File.ReadAllLines(FilePath); 
     this.size = Lines.Length; 
     foreach (string line in Lines) 
     { 

      bgReports.ReportProgress(allreadtchecked/size); 

을 수행

이 내가 무엇입니까?

답변

1

패스 참조. 아래에서 시도하십시오

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     inst.init(this.textBox1.Text, this.textBox2.Text); 
     inst.ParseTheFile(backgroundWorker1); 
     System.Windows.Forms.MessageBox.Show("Parsing finish successfully"); 
    } 

파서 클래스에서.

public Parsser() 
    { 
     //Don't initialize backgroundworker here. 
    } 

    public ParseTheFile(BackgroundWorker bgWorker) 
     { 
      bgReports = bgWorker; 
      ..... 
     } 
+0

내가 코드를 변경하고 난에 backgroundWorker1을 보내 파서 관측기. 파서 클래스에서 나는 bgReports.ReportProgress (allreadtchecked/size)를 호출한다. private void backgroundWorker1_ProgressChanged에 의해이 이벤트를 잡으려고 시도하지만 여전히 개인적인 무효로 가지 않는다 backgroundWorker1_ProgressChanged – MoShe

+0

이 응답은 여전히 ​​두 번째 BackgroundWorker 인 bgReports를 사용합니다.당신은 정말로 2 개의 수업을 공유해서는 안되며, 두 번째 작업자도 있어야합니다. –

+0

그래서 대답은 무엇이되어야합니까? – MoShe

0

DoWorkEventHandler을 통해 작업을 수행하려면 배경 작업자를 설정해야합니다. 또한 부분 클래스의 각 절반이 자체 BackgroundWorker를 사용하고있는 것처럼 보입니다. 동일한 참조를 사용해야합니다. bgreports 및 backgroundWorker1 있습니다.

backgroundWorker1.DoWork += MyMethod; 


// ...... 


private void MyMethod(object sender, DoWorkEventArgs e) 
{ 
} 

왜 텍스트 상자에서 null을 테스트하고 있습니까? null에 대한 텍스트 문자열 내용을 테스트하려고합니까? 그렇다면 String.IsNullOrEmpty를 사용합니다.

더 나은 디자인은 "Parsser"(철자법을 고쳐서이 클래스가 Opertional 코드 용으로 어떤 유형인지 목적을 식별하십시오)가 소비자 클래스가 구독하는 자체 이벤트를 정의하는 것입니다. 파서는 자신을 비동기 적으로 실행해야 할 책임이 없습니다. 소비자는 동기식 또는 비동기식으로 무언가를 실행해야합니다. 이러한 경우에 사용자 지정 진행 이벤트를 정의하고 구독 할 수 있습니다 (다시 선택 사항). BackgroundWorkerParsser 및 그 참조 호출을 ReportProgrss 방법

BackgroundWorker worker; 

public Parsser(BackgroundWorker bg) 
    { 
     worker = bg; 
    } 

public void ParseTheFile() 
{ 
    Lines = File.ReadAllLines(FilePath); 
    this.size = Lines.Length; 
    foreach (string line in Lines) 
    { 
     worker.ReportProgress(allreadtchecked/size); 
1

당신은 Parsser 클래스 생성자에 중복 BackgroundWorkder 인스턴스를 만들를 사용

1

담당 직원 방법에 람다 또는 방법을 전달합니다 형태로

:

파서에서
public void Run() 
{ 
    myParse.DoWork(a => UpdateProgressBar(a.Progress)); 
} 

private void UpdateProgressBar(int progress) { ... } 

:

public void Parse(Action<ProgressArgs> onProgress) 
{ 
    // do your job 
    // invoke onProgress whenever needed 
    onProgress(current/total * 100); 
} 
관련 문제