私は私のアプリケーションでタイマーの世話をするバックグラウンドワーカーを持っています。これはコードです:
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();
}