C# 강좌 : 제 29강 - 쓰레드 (2)
쓰레드(Thread)
쓰레드를 사용할 때 일정한 부분은 순차적
으로 실행되어야 정상적으로 프로그램이 구동됩니다.
사용자 정의 함수
를 이용하면 이 부분을 해결 할 수 있습니다.
프로젝트 구성
도구상자에서 TextBox를 Form1에 생성하며, MultiLine에 체크합니다.
UnSafe 방법
CrossThread
를 사용하지 않고 CheckForIllegalCrossThreadCalls = false;
을 선언하여 안전하지 않은 방법
으로 코드를 구성할 수 있습니다.
이 경우, Invoke
와 delegate
를 사용하지 않고 직접적으로 컨트롤을 호출
하여 사용할 수 있습니다. 하지만 중대한 오류가 발생할 수 있습니다.
전체 코드
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();
}
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회
만 실행되는 것을 확인할 수 있습니다.
실행 결과
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 Project
{
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가 출력되는 것을 확인할 수 있습니다.
실행 결과
공유하기


댓글 남기기