상위 목록: 하위 목록: 작성 날짜: 읽는 데 10 분 소요

쓰레드(Thread)

프로그램의 코드는 순차적으로 실행되지만, 필요에 의해서 여러 작업을 한 번에 해야할 경우가 생깁니다.

이때 쓰레드를 이용하면 여러 프로세스를 나눠서 동시에 실행하는 것처럼 구성할 수 있습니다.



프로젝트 구성

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



전체 코드

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 Project
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        { 
            Thread Thread_A = new Thread(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    CrossThread(textBox1, "A");
                }
            });

            Thread Thread_B = new Thread(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    CrossThread(textBox1, "B");
                }
            });

            Thread Thread_C = new Thread(() =>
            {
                for (int i = 0; i < 100; i++)
                {
                    CrossThread(textBox1, "C");
                }
            });

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

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


세부 코드

namespace

using System.Threading;

Thread를 사용하기 위하여 namespaceSystem.Threading를 선언합니다.


Thread 생성

Thread 쓰레드이름 = new Thread(() =>
{
    //코드
});

코드를 입력하거나 메서드, 사용자정의함수, 델리게이트, 람다 등을 넘겨줄 수 있습니다.


Thread 코드

Thread Thread_A = new Thread(() =>
{
    for (int i = 0; i < 100; i++)
    {
        CrossThread(textBox1, "A");
    }
});

for문을 이용하여 100회동안 CrossThread()라는 사용자 정의 함수를 반복하는 코드를 구성합니다.



CrossThread

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

쓰레드에 직접적으로 호출할 경우 아래와 같은 크로스 쓰레드(Cross Thread) 문제가 발생합니다.

System.InvalidOperationException: ‘크로스 스레드 작업이 잘못되었습니다. ‘textBox1’ 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.’

이 문제는 컨트롤을 생성한 쓰레드가 아닌 다른 쓰레드에서 컨트롤을 다루려할 때 발생합니다.

이를 해결하기 위하여 Invokedelegate를 이용해 안전한 방법으로 폼의 컨트롤을 다룰 수 있습니다.


Thread 실행

쓰레드이름.Start();

쓰레드이름.Start();를 이용하여 쓰레드를 실행할 수 있습니다.


실행 결과

댓글 남기기