Thread 사용 시 컨트롤에 접근하기 입니다.

 

Thread를 사용하여 컨트롤에 접근했을 때 cross-thread exception 이 발생합니다.

 

exception 발생 안하고 컨트롤에 접근하는 방법입니다.

 

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

namespace ThreadTest
{
    /// <summary>
    /// 메인폼 클래스 입니다.
    /// </summary>
    public partial class MainForm : Form
    {
        #region Fields
        
        /// <summary>
        /// 스레드 입니다.
        /// </summary>
        private Thread thread;
        
        #endregion

        // Construcotr (Public)

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

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

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

            this.startButton.Click += startButton_Click;

            #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.Enabled = false;

            this.thread = new Thread(new ThreadStart(IncreaseNumber));

            this.thread.Start();
        }

        #endregion

        // Method (Private)

        #region IncreaseNumber() - 숫자를 증가시킵니다.

        /// <summary>
        /// 숫자를 증가시킵니다.
        /// </summary>
        private void IncreaseNumber()
        {
            for(int i = 0; i < 10; i++)
            {
                this.Invoke(new Action(delegate()
                {
                    this.numberDisplayTextBox.Text = i.ToString();
                }));

                Thread.Sleep(1000);
            }

            this.Invoke(new Action(delegate()
            {
                this.Enabled = true;
            }));
        }

        #endregion
    }
}

 

+ Recent posts