C# 강좌 : 제 29강 - 쓰레드 (2)

   

쓰레드 (Thread)


쓰레드를 사용할 때 일정한 부분은 순차적으로 실행되어야 정상적으로 프로그램이 구동됩니다. 사용자 정의 함수를 이용하면 이 부분을 해결 할 수 있습니다.


프로젝트 구성


1 도구상자에서 TextBox를 Form1에 생성하며, MultiLine에 체크합니다.


UnSafe 방법


CrossThread를 사용하지 않고 CheckForIllegalCrossThreadCalls = false;을 선언하여 안전하지 않은 방법으로 코드를 구성할 수 있습니다. 이 경우, Invokedelegate를 사용하지 않고 직접적으로 컨트롤을 호출하여 사용할 수 있습니다. 하지만 중대한 오류가 발생할 수 있습니다.


코드


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

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
        }

        private void Form1_Load(object sender, EventArgs e)
        { 
            Thread Thread_A = new Thread(TEST_1);
            Thread Thread_B = new Thread(TEST_2);
            Thread Thread_C = new Thread(TEST_3);

            Thread_A.Start();
            Thread_B.Start();
            Thread_C.Start();
        }

        public void TEST_1()
        {
            for (int i = 0; i < 100; i++)
            {
                textBox1.Text += "A";
            }
        }

        public void TEST_2()
        {
            for (int j = 0; j < 70; j++)
            {
                textBox1.Text += "B";
            }
        }

        public void TEST_3()
        {
            for (int k = 0; k < 50; k++)
            {
                textBox1.Text += "C";
            }
        }
    }
}

CheckForIllegalCrossThreadCalls = false; 을 선언하여 다른 쓰레드에서 컨트롤을 다룰 수 있습니다. 하지만, A가 100회, B가 70회, C가 50회가 실행되지 않고 모두 합하여 100회만 실행되는 것을 확인할 수 있습니다.


Result


2 3


Safe 방법


CrossThread를 사용하여 함수에 호출하는 방법으로 안전하게 코드를 구성하여야 오류가 발생하지 않습니다.


코드


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

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

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread Thread_A = new Thread(TEST_1);
            Thread Thread_B = new Thread(TEST_2);
            Thread Thread_C = new Thread(TEST_3);

            Thread_A.Start();
            Thread_B.Start();
            Thread_C.Start();
        }

        public void TEST_1()
        {
            CrossThread(textBox1, 100, "A");
        }

        public void TEST_2()
        {
            CrossThread(textBox1, 70, "B");
        }

        public void TEST_3()
        {
            CrossThread(textBox1, 50, "C");
        }

        public static void CrossThread(Control item, int num, string text)
        {
            if (item.InvokeRequired)
            {
                item.BeginInvoke(new MethodInvoker(delegate ()
                {
                    for (int i = 0; i < num; i++)
                    {
                        item.Text += text;
                    }
                }));
            }
        }
    }
}
    

A가 100회, B가 70회, C가 50회가 실행되고 연속적으로 A, B, C가 출력되는 것을 확인할 수 있습니다.


Result


4 5



도움이 되셨다면 광고 클릭 부탁드립니다.

⤧  Next post C# 예제 : Tab Menu ⤧  Previous post C# 강좌 : 제 28강 - 쓰레드 (1)