BackGroundWorker 예제 ( Thread 대용품 )
Programming/WinForm / 2014. 11. 4. 02:28
주의 : 자칫 폼을 죽일 수 있음. 14 - 5 - 8 일 작성한 Thread 예제 사용 가능
thread 사용에는 form 내부의 control에 접근하기 어려운 점들이 있다.
progress Bar 나 text Box 등 접근해서 처리했으면 하는 것들이 있는데
이를 해결하기 위해 C#에 존재하는 것이 BackGroundWorker 이다.
Thread 와 동일하게 Work, Complete 가 존재하며,
특별히 progressChanged 라는 것을 통해서
Progress Bar 를 좀 더 편하게 처리할 수 있다.
- BackgroundWorker backgroundWorker1 = new BackgroundWorker();
- public Form1()
- {
- InitializeComponent();
- backgroundWorker1.DoWork += new DoWorkEventHandler(Work);
- backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(ProgressB);
- backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompleteWork);
- backgroundWorker1.WorkerReportsProgress = true;
- progressBar1.Maximum = 100000;
- }
위 소스와 같이 BackGroundWorker 를 선언하고, Work(), ProgressB(), CompleteWork()를 각기 선언해준다.
Work() 는 실제로 BackGround 상에서 수행해야 할 작업을 넣어두면 된다.
- private void Work(object sender, DoWorkEventArgs e)
- {
- for (int i = 0; i < 100000; i++)
- {
- backgroundWorker1.ReportProgress(i);
- }
- }
위는 ReportProgress 를 통해서 bar 를 움직이는 work 이다.
- private void ForForFor(object sender, DoWorkEventArgs e)
- {
- for (int i = 0; i < 100000; i++)
- {
- backgroundWorker1.ReportProgress(i);
- }
- }
ProgressChangedEvent 인 ProgressB 는
- private void ProgressB(object sender, ProgressChangedEventArgs e)
- {
- progressBar1.Value = e.ProgressPercentage;
- }
위와 같이 나타나며, backgroundWorker1.ReportProgress(i) 로 처리가 가능하다.
마지막으로 CompleteWork() 이며
- private void CompleteWork(object sender, RunWorkerCompletedEventArgs e)
- {
- if (e.Cancelled == true)
- {
- }
- else if (e.Error != null)
- {
- }
- else
- {
- }
- }
으로 나타낼 수 있다. Cancell 과 Error 등의 상황으로 예외처리가 가능하고
마지막 else 는 정상적인 처리가 끝났을 때, 무언가 처리를 하고 싶을 때 하면 된다.
BackGroundWorker를 시작하고 싶을 때는
- private void button1_Click(object sender, EventArgs e)
- {
- backgroundWorker1.RunWorkerAsync();
- }
RunWorkerAsync() 를 통해서 시작하면~ 끗.
반응형
'Programming > WinForm' 카테고리의 다른 글
[펌] C# WinForm "인증서 저장소에서 매니페스트 서명 인증서를 찾을 수 없습니다." (0) | 2019.01.25 |
---|---|
Load a Cursor from a Resources in C# (0) | 2014.11.07 |
BackgroundWorker 클래스 (0) | 2014.11.04 |
쓰레드 선호도 (Thread Affinity) (0) | 2014.11.03 |
Cursors in C# (0) | 2014.11.03 |