■ SynchronizationContext 클래스 : 크로스 스레드(Cross Thread) 처리하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


MainForm.cs

 

 

using System;

using System.Threading;

using System.Windows.Forms;

 

namespace TestProject

{

    /// <summary>

    /// 메인 폼

    /// </summary>

    public partial class MainForm : Form

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region Field

 

        /// <summary>

        /// 동기화 컨텍스트

        /// </summary>

        private SynchronizationContext context;

 

        /// <summary>

        /// 실행 여부

        /// </summary>

        private bool isRunning;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor

        ////////////////////////////////////////////////////////////////////////////////////////// Public

 

        #region 생성자 - MainForm()

 

        /// <summary>

        /// 생성자

        /// </summary>

        public MainForm()

        {

            InitializeComponent();

 

            this.context = SynchronizationContext.Current;

 

            this.isRunning = false;

 

            this.runButton.Click += runButton_Click;

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        //////////////////////////////////////////////////////////////////////////////// Event

 

        #region 실행 버튼 클릭시 처리하기 - runButton_Click(sender, e)

 

        /// <summary>

        /// 실행 버튼 클릭시 처리하기

        /// </summary>

        /// <param name="sender">이벤트 발생자</param>

        /// <param name="e">이벤트 인자</param>

        private void runButton_Click(object sender, EventArgs e)

        {

            if(this.isRunning)

            {

                return;

            }

 

            this.runButton.Enabled = false;

 

            this.isRunning = true;

 

            Thread thread = new Thread(ProcessThread);

 

            thread.Start();

        }

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////// Function

 

        #region 스레드 처리하기 - ProcessThread()

 

        /// <summary>

        /// 스레드 처리하기

        /// </summary>

        private void ProcessThread()

        {

            this.context.Send

            (

                _ => {

 

                    this.messageLabel.Text = "처리를 시작합니다.";

 

                    this.progressBar.Value = 50;

                },

                null

            );

 

            Thread.Sleep(3000);

 

            this.context.Send

            (

                _ =>

                {

                    this.progressBar.Value = 100;

 

                    this.messageLabel.Text = "처리가 완료되었습니다.";

 

                    this.isRunning = false;

 

                    this.runButton.Enabled = true;

                },

                null

            );

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker

댓글을 달아 주세요