저는 응용 프로그램에서 타이머를 처리하는 백그라운드 워커를 보유하고 있습니다. 이 코드입니다 : Backgroundworker ReportProgress 이벤트가 실행되지 않습니다.
protected override void OnLoad(EventArgs e)
{
// Inizializzo il backgroundworker
bgwTimer.WorkerReportsProgress = true;
bgwTimer.WorkerSupportsCancellation = true;
bgwTimer.DoWork += (bgwTimer_DoWork);
bgwTimer.RunWorkerCompleted +=(bgwTimer_RunWorkerCompleted);
bgwTimer.ProgressChanged += (bgwTimer_ProgressChanged);
}
void bgwTimer_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
throw new NotImplementedException();
}
void bgwTimer_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
throw new NotImplementedException();
}
는 기본적으로 이벤트는 "ProgressChanged"해고되지 않습니다 그래서 나는 진행 막대의 상태를 업데이트 할 수 없습니다. 이벤트 DoWork가이 방법에 연결되어 있습니다 :
void bgwTimer_DoWork(object sender, DoWorkEventArgs e)
{
int i = 0;
if (bgwTimer.CancellationPending)
{
e.Cancel = true;
}
else
{
while (bgwTimer.IsBusy)
{
Thread.Sleep(1000);
bgwTimer.ReportProgress(i);
refreshTimer();
}
}
}
을 내 옆에 코드는 외모와 그것을 잘 실행됩니다. 보시다시피 ReportProgress 메서드가 호출되었지만 이벤트가 발생하지 않습니다. 어떤 힌트?
업데이트 : 위젯! 이벤트 "bgwTimer_ProgressChanged"가 이벤트 선언 직후에 RunWorkerAsync를 실행 한 경우에만 발생하는 것으로 나타났습니다. 기본적으로 :
bgwTimer.ProgressChanged + = (bgwTimer_ProgressChanged); bgwTimer.RunWorkerAsync(); //이 작품!
사용자가 버튼을 누를 때 작업자를 실행하기 때문에 이벤트가 트리거되지 않습니다.
private void btnNext_Click(object sender, EventArgs e)
{
this.TopMost = true;
btnNext.Enabled = false;
progressBar1.Step = 0;
if (_bgwTimer.IsBusy)
_bgwTimer.CancelAsync();
else
_bgwTimer.RunWorkerAsync();
}
이벤트가 발생하지 않는 이유는 무엇입니까? – Jan
도움이 될만한 참고 자료 (문제는 아직 찾을 수 없음)는 다음과 같습니다. http://www.albahari.com/threading/part3.aspx#_BackgroundWorker –
'refreshTimer'의 기능은 무엇입니까? –