본문 바로가기
C#/Winform

C# / Winform BackgroundWorker로 컨트롤에 접근하기.

by HyunS_ 2019. 5. 29.

BackgroundWorker로 컨트롤에 접근하기 입니다.

 

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace ThreadTest
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {
        #region Fields
        
        /// <summary>
        /// 백그라운드 워커 입니다.
        /// </summary>
        private BackgroundWorker backgroundWorker;
        
        #endregion

        // Construcotr (Public)

        #region MainForm() - 생성자 입니다.

        /// <summary>
        /// 생성자 입니다.
        /// </summary>
        public MainForm()
        {
            InitializeComponent();

            #region 이벤트를 설정합니다.

            this.backgroundWorker = new BackgroundWorker();
        
            this.backgroundWorker.WorkerReportsProgress = true;
            this.backgroundWorker.WorkerSupportsCancellation = true;
            
            this.startButton.Click += startButton_Click;
            this.backgroundWorker.DoWork += backgroundWorker_DoWork;
            this.backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged;
            this.backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted;

            #endregion
        }

        #endregion

        // Event Method (Private)

        #region startButton_Click(sender, e) - 시작 버튼 클릭시 동작합니다.

        /// <summary>
        /// 시작 버튼 클릭시 동작합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void startButton_Click(object sender, EventArgs e)
        {
            this.backgroundWorker.RunWorkerAsync();
        
            this.Enabled = false;
        }

        #endregion

        #region backgroundWorker_DoWork(sender, e) - RunWorkerAsync()가 호출될 때 발생합니다.

        /// <summary>
        /// RunWorkerAsync()가 호출될 때 발생합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for(int i=0; i<10; i++)
            {
                this.backgroundWorker.ReportProgress(i);
                
                Thread.Sleep(1000);
            }
        }

        #endregion
        #region backgroundWorker_ProgressChanged(sender, e) - ReportProgress(Int32)가 호출될 때 발생합니다.

        /// <summary>
        /// ReportProgress(Int32)가 호출될 때 발생합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.numberDisplayTextBox.Text = e.ProgressPercentage.ToString();
        }

        #endregion
        #region backgroundWorker_RunWorkerCompleted(sender, e) - 백그라운드 작업이 완료되거나 취소되거나 예외를 발생시켰을 때 발생합니다.

        /// <summary>
        /// 백그라운드 작업이 완료되거나 취소되거나 예외를 발생시켰을 때 발생합니다.
        /// </summary>
        /// <param name="sender">이벤트 발생자 입니다.</param>
        /// <param name="e">이벤트 인자 입니다.</param>
        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.Enabled = true;
        }

        #endregion

    }
}
728x90

댓글