2009-11-04 1 views
1

새 백그라운드 작업자에서 새 클래스를 시작하는 클래스가 하나 있는데 백그라운드 작업자는 progresschanged 섹션을 사용하여 상태 메시지를 다시 전달합니다.백그라운드 작업자 클래스 및 C에서 다른 클래스의 진행 이벤트를 사용하여 메시지 전달

내가 시도하고 그리고 난 내가 정의하기 전에 객체를 사용하고 오류가 별도의 클래스에서

classname.Dataworker.reportprogress(5) 

을 입력하여 사용합니다.

나는 모든 예제에서 단일 클래스와 다른 기능을 사용한다는 것을 알았습니다.

어리석은 실수 일지 모르지만 나는 그것을 볼 수 없다. 도움을 주셔서 감사합니다!

내 코드의 일반적인 개요는 다음과 같습니다

//form class 

public static BackgroundWorker bw = new BackgroundWorker(); 

onbuttonclick 
{ 
     installer install = new installer(); 
     bw.WorkerReportsProgress = true; 
     bw.WorkerSupportsCancellation = true; 
     bw.DoWork += class2.aFunction; 
     bw.ProgressChanged += new ProgressChangedEventHandler(mainForm_InstallerEvent); 
     bw.RunWorkerAsync(); 
} 

private void mainForm_InstallerEvent(object sender, ProgressChangedEventArgs e) 
{ 

     lbl.Text = e.UserState.ToString(); 
} 

가 ////받는 비율 값을 전달하는

aFunction 
{ 
     InstallerForm.bw.ReportProgress(5); //errors on this! 
} 

답변

1

도와 주셔서 감사합니다. 답변과 그 중 하나를 찾았는데 발견되었으므로 놓친 행은 다음과 같습니다. BackgroundWorker worker = (BackgroundWorker) sender;

다음 worker.reportprogress (..)

내가 유용하다고 가이드가 함께하는 작업자 객체를 참조 : http://www.nerdparadise.com/tech/coding/csharp/backgroundworker/

완벽한, 고마워 :)

0

ReportProgress가 배경 작업자 스레드가 사용하는 백그라운드 작업자 클래스를 CLASS2 Progress_Changed 대리인. 이 article은 동기 및 비동기 모두의 예제를 보여줍니다.

6

이 같은 수행하려는 경우 당신은 UserState와 ReportProgress를 호출해야합니다

lbl.Text = e.UserState.ToString(); 

그런 다음 호출은 다음과 같이 보일 것입니다 :

aFunction 
{ 
     InstallerForm.bw.ReportProgress(5, "5% Complete"); 
} 

을 마우스 오른쪽 단추로 지금의 모습을 e.UserState는 null이되고 ToString()을 호출하면 null 참조 예외가 발생합니다.
Here은 UserState가 텍스트 인 예제입니다.

0

이 내 게으른 해결 방법 (지금까지 추가 이벤트 처리기를 사용하고 싶지 않았기 때문에). 그 당시 나는 또한 userstate을 이해하고 싶지 않았다;) 그래서 나는 특정 긴 작업에 대한 모든 경고/메시지와 함께 목록을 사용했다. 메시지 문자열은 앱 내의 강력한 리소스 저장소 인 App.Properties.Settings에 저장되었습니다. ReportProgress은 정수를 취하기 때문에 ReportProgress에서 Progress_Changed까지 목록 색인을 보냅니다.

예 : do_work에서 다음과 같은 메서드가 호출되었습니다.

private void LongOperation() 
{ 
     try 
     { 
      //the operation 
      if (success){ 
      //write a message to a status label 
      bgWorker.ReportProgress(1); 
      } 
      else{ 
      //write a message to a status label 
      bgWorker.ReportProgress(2); 
      }    
     } 
     catch(){...} 
    } 

    public void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs p) 
    { 
     int lstIndex = p.ProgressPercentage; 
     lblStatus.Text = mssglist[lstIndex].ToString(); 
    } 
관련 문제