WPF - BackgroundWorker

2009, Dec 08    

BackgroundWorker는 System.ComponetModel에 정의 되어 있으며


UI를 반응없는현상을 방지하기 위해 별도의 스레드에서 작동하도록 하는 클래스이다.


MSDN에서의 설명

BackgroundWorker 클래스를 사용하면 별도의 전용 스레드에서 작업을 실행할 수 있습니다. 

다운로드 및 데이터베이스 트랜잭션과 같은 시간이 많이 걸리는 작업이 실행되는 동안에는

UI(사용자 인터페이스)가 응답을 중지한 것처럼 보일 수 있습니다. UI의 응답 속도를 

높이려 하고 이러한 작업과 관련된 지연 시간이 길어지는 경우 BackgroundWorker 

클래스는 간편한 해결책을 제공합니다.

지금 만들고 있는 Maple이라는 프로그램의 소스 일부분 이다.ㅋ

</p>
public partial class OpenApiDialog : Window
{
.
.
.</p>

BackgroundWorker bw_search_album;//앨범검색
int SA_count;//검색된 앨범수

public OpenApiDialog() //클래스생성자
{
InitializeComponent();
.
.

bw_search_album = new BackgroundWorker();
bw_search_album.DoWork += new DoWorkEventHandler(bw_SA_DoWork);
//스레드 돌아가는 곳;
bw_search_album.ProgressChanged += bw_SA_ProgressChanged;
//ReportProgress가 호출될떄 마디 실행
bw_search_album.RunWorkerCompleted += bw_SA_RunWorkerCompleted;
//완료 시 할 작업
bw_search_album.WorkerReportsProgress = true;
//진행보고하는것을 사용할꺼인지 확인.
}

void bw_SA_DoWork(object sender, DoWorkEventArgs e)//openapi 이용 앨범 검색
{

//여기서는 UI객체에 접근하면 에러..
bw_search_album.ReportProgress(0);//시작 알려줌.
.
.
.

foreach (XmlNode XMLSearchItem in SearchItemNodes)
{
try
{
.
.
.

bw_search_album.ReportProgress(++i);//경과 보고
}
catch (Exception)
{
continue;
}
}
}

void bw_SA_ProgressChanged(object sender,ProgressChangedEventArgs e)
{

//여기서는 UI객체에 접근해도 됨..
if(e.ProgressPercentage == 0)
{
progressBar.IsIndeterminate = true;
progressBar.Orientation = Orientation.Horizontal;
ProgressText.Text = "OpenApi 접근중.....";
}

else{
ProgressText.Text = e.ProgressPercentage + " / "+SA_count+" 검색 완료";
}
}

void bw_SA_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
{

//여기서는 UI객체에 접근해도 됨..
Progress.Visibility = Visibility.Hidden;
page1_listbox.ItemsSource = Search_Album_result;
}</span></div>

</div>