티스토리 뷰

프로그래밍/C#

백그라운드워커 (BackgroundWorker)

뽀로로친구에디 2021. 9. 27. 13:15

 

BackgroundWorker 클래스
-  BackgroundWorker 클래스는 별도의 쓰레드에게 어떠한 일들을 시키기 위해 사용하는 클래스로 다운로드 및 데이터베이스 트랜잭션과 같은 시간이 많이 걸리는 작업이 실행되는 동안에는 UI가 응답을 중지하는 것처럼 보일 수 있다. 그래서 UI 쓰레드와는 별도로 BackgroundWorker 쓰레드를 이용하면 별도로 작업들 수행할 수 있습니다.


1.  DoWorker 이벤트
- 작업할 내용을 지정하는 이벤트입니다.
- 작업을 시작하려면 RunWorkerAsync를 호출합니다.
- Dowork 이벤트 처리기에서 UI개체를 조작하지 않도록 주의한다.
- ProgressChanged 및 RunWorkerAsync를 통해 UI와 통신합니다.


2. ProgressChanged 이벤트
- DoWorker의 진행률 사항을 알려줍니다.

3. RunWorkerCompleted 이벤트
-  작업 완료를 알리는 이벤트입니다.

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BackgroundWorker
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        struct DataParameter
        {
            public int Process;
            public int Delay;
        }

        private DataParameter inputParameter;


        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
            label1.Text = string.Format("처리중 ...... {0}%", e.ProgressPercentage);
            progressBar1.Update();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            int process = ((DataParameter)e.Argument).Process;
            int delay = ((DataParameter)e.Argument).Delay;
            int index = 1;
            try
            {
                for(int i = 0; i < process; i++)
                {
                    if (!backgroundWorker1.CancellationPending)
                    {
                        backgroundWorker1.ReportProgress(index++ * 100 / process, string.Format("처리 데이터 {0}", i));
                        Thread.Sleep(delay); // 작동 시간을 시뮬레이션하는 데 사용
                        // 여기에 코드를 추가하십시오 ... 
                    }
                }
            }
            catch(Exception ex)
            {
                backgroundWorker1.CancelAsync();
                MessageBox.Show(ex.Message, "메시지", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            MessageBox.Show("처리 완료", "메시지", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (!backgroundWorker1.IsBusy)
            {
                inputParameter.Delay = 10;
                inputParameter.Process = 1200;
                backgroundWorker1.RunWorkerAsync(inputParameter);
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy)
                backgroundWorker1.CancelAsync();
        }
    }
}

 

https://youtu.be/2iuMxW4oSFs

 

- YouTube

 

www.youtube.com

 

댓글
최근에 달린 댓글
글 보관함
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total
Today
Yesterday
    뽀로로친구에디
    최근에 올라온 글