wpf 비동기 background worker

Eden·2024년 6월 27일
0

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();//작업 취소 요청
}
profile
주섬주섬..

0개의 댓글