background worker로 비동기 작업을 구현 할 수 있다.
BackgroundWorker backgroundWorker;
private void createWork(){
backgroundWorker = new BackgroundWorker
{
WorkerReportsProgress = true, // 진행률 업데이트를 보고하는 기능
WorkerSupportsCancellation = true //해당 작업을 취소를 지원
};
backgroundWorker.DoWork += BackgroundWorker_DoWork; //비동기로 실행할 메인 작업
backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged; 작업 진행간 진행률을 업데이트 받는 이벤트 함수
backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted; //작업이 완료(취소)되었을때 발생하는 이벤트
ProgressBar.Visibility = Visibility.Visible;
backgroundWorker.RunWorkerAsync(); //비동기 작업 실행
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
int maxValue = 50;
backgroundWorker.ReportProgress(0, maxValue); //첫번째 파라미터는 ProgressPercentage(int) 값으로, 두번째는 UserState(object) 값으로 넘겨짐
for (int i=0; i<maxValue, i++)
{
if (backgroundWorker.CancellationPending)//취소 요청을 받았으면
{
e.Cancel = true;
return;
}
System.Threading.Thread.Sleep(100); // 예제용 대기
backgroundWorker.ReportProgress(i);// UserState값이 null인체 ProgressPercentage 값만 전달
}
}
private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.UserState is int totalNodes)//만약 UserState 값이 int형이면 totalNodes라는 변수에 값을 할당
{
// ProgressBar(xaml Control) 최대값 설정 , 그밖에 ProgressChanged 이벤트를 통해 다양하게 응용가능할 것으로 보임
ProgressBar.Maximum = totalNodes;
}
ProgressBar.Value = e.ProgressPercentage;
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
System.Windows.MessageBox.Show("작업이 취소되었습니다.");
}
else
{
System.Windows.MessageBox.Show("작업이 완료되었습니다.");
}
ProgressBar.Visibility = Visibility.Hidden;
}
public void StopWork()
{
backgroundWorker.CancelAsync();//작업 취소 요청
}