2012-06-27 3 views
0

dI에는 데이터베이스를 통해 작업 상태를 모니터링하는 winforms 시스템 트레이 응용 프로그램이 있습니다. 시스템 트레이를 클릭하면 현재 활성 작업 메뉴가 열리고 작업을 클릭하면 메시지와 진행률 표시 줄이 표시되는 양식이 만들어집니다.RunWorkerCompleted가 호출되는 이유는 무엇입니까?

형태의 생성자는 다음

public JobStatusForm() 
    { 
     InitializeComponent(); 

     activeJobsBGWorker = new BackgroundWorker(); 
     activeJobsBGWorker.DoWork += new DoWorkEventHandler(activeJobsBGWorker_DoWork); 
     activeJobsBGWorker.ProgressChanged += new ProgressChangedEventHandler(activeJobsBGWorker_ProgressChanged); 
     activeJobsBGWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(activeJobsBGWorker_RunWorkerCompleted); 
    } 

이며, 상황에 맞는 방법에 대한 클릭 이벤트 핸들러가 JobStatusForm.Show()를 호출합니다. 양식에 나는 가지고있다 :

private void JobStatusForm_Shown(object sender, EventArgs e) 
    { 
     activeJobsBGWorker.RunWorkerAsync(); 
    } 

작업자를 시작하십시오.

작업자가 시작되고 무언가가 RunWorkerCompleted 이벤트를 발생시키는 것으로 나타났습니다. 보낸 사람은 백그라운드 작업자이며 이벤트 args는 null입니다.

어떻게이 이벤트를 발생시키는 지 알 수 있으며 어떻게 중지/다시 시작할 수 있습니까?

감사합니다,

편집 :

현재의 Do_Work 코드는 다음과 같습니다

private void activeJobsBGWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 

     //while (!e.Cancel) 
     while (true) 
     { 
      _clr.JobStatus status = _clr.SystemDataHelper.GetCurrentJobActivity(_clr.SystemDataHelper.GetLocation(), this.job_ID); 

      //if (activeJobsBGWorker.CancellationPending) 
      // continue; 

      activeJobsBGWorker.ReportProgress(status.pc, status); 

      Thread.Sleep(250); 
     } 
    } 

은 내가 ReportProgress 라인에 중단 점을 설정하고, 적중되지 않습니다.

_clr은 dll로 빌드 된 C++ 프로젝트에 대한 호출이며 데이터베이스를 호출하는 정적 메서드를 호출합니다.

+1

activeJobsBGWorker_DoWork의 코드가 완료되었으므로 BackgroundWorker가 이벤트를 발생시키고 있습니까? 그 코드를 게시 할 수 있습니까? – Michael

+1

RunWorkerCompleted 처리기에 중단 점을 넣고 충돌이 발생하면 호출 스택을 검사하여 누가 그 사건을 제기했는지 확인합니다. –

+0

이것은 모두 MSDN 라이브러리에서 잘 다루어집니다. RTFM 링크를 생성하지 않는 질문을 공식화해야합니다. –

답변

3

Do_Work 메서드의 예외로 인해 RunWorkerCompleted가 발생합니다.

관련 문제