[C#] 윈폼 크로스 스레드 해결 방법


 

이번 포스팅에서는 C# 윈폼을 이용하여 프로젝트를 하실 때, 자주 접하는 오류 중 하나인 크로스 스레드 해결 방법에 대해서 알아보도록 하겠습니다.


 

윈폼은 구조상 어쩔 수 없이 크로스 스레드 예외가 발생 될 수 밖에 없는데..그럴 때 당황하지 마시고 아래 코드와 같이 Invoke 문을 선언하여서 크로스 스레드를 방지해 주시면 됩니다.


 

우선 간단한 윈폼 프로젝트를 생성해 주시고 아래와 같이 Textbox 컨트롤을 배치시켜 주시기 바랍니다.





 

그리고 내부 코드를 아래와 같이 작성해 주시기 바랍니다.


 

아래 코드에 대해서 간단히 설명을 드리자면 A, B, C 스레드 3개를 선언하여 동시에 Start를 시켜주고 각각 반복문을 돌려서 A, B, C 문자를 동일한 Textbox에 접근하여 출력 되게 끔 하는 시나리오로써,


 

원래 이론적으로는 동시에 같은 컨트롤에 서로 다른 스레드 객체 3개가 접근을 하게 되면 크로스 스레드 오류가 발생 되지만, 아래와 같이 Invoke 문을 이용하여 에러 없이 출력이 제대로 되는 것을 확인 하실 수 있습니다.


[Program.cs]


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace 크로스_스레드_방지

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

 

        private void Form1_Load(object sender, EventArgs e)

        {

            Thread thread_A = new Thread(new ThreadStart(A));

            Thread thread_B = new Thread(new ThreadStart(B));

            Thread thread_C = new Thread(new ThreadStart(C));

 

            thread_A.Start();

            thread_B.Start();

            thread_C.Start();

        }

 

        public void A()

        {

            for (int i = 0; i < 100; i++)

            {

                CrossThread(textBox1, "A");

            }

        }

 

        public void B()

        {

            for (int i = 0; i < 100; i++)

            {

                CrossThread(textBox1, "B");

            }

        }

 

        public void C()

        {

            for (int i = 0; i < 100; i++)

            {

                CrossThread(textBox1, "C");

            }

        }

 

        /// <summary>

        /// 크로스 스레드 방지 메서드

        /// </summary>

        /// <param name="item"></param>

        /// <param name="text"></param>

        public static void CrossThread(Control item, string text)

        {

            if (item.InvokeRequired)

            {

                item.BeginInvoke(new MethodInvoker(delegate()

                    {

                        item.Text += text;

                    }));

            }

        }

    }

}

 

Colored by Color Scripter

cs

 

 

[실행 결과 화면]




이로써 크로스 스레드 해결 방법에 대해서 알아보았습니다.

 

감사합니다.^^


728x90

이 글을 공유하기

댓글

Designed by JB FACTORY