C# 강좌 : 제 28강 - 쓰레드 (1)
쓰레드(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
를 사용하기 위하여 namespace
에 System.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’ 컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다.’
이 문제는 컨트롤을 생성한 쓰레드가 아닌 다른 쓰레드에서 컨트롤을 다루려할 때 발생합니다.
이를 해결하기 위하여 Invoke
와 delegate
를 이용해 안전한 방법으로 폼의 컨트롤을 다룰 수 있습니다.
Thread 실행
쓰레드이름.Start();
쓰레드이름.Start();
를 이용하여 쓰레드를 실행할 수 있습니다.
실행 결과
공유하기


댓글 남기기