Windows_/Windows_C# & App

C#: Thread 사용법과 프로퍼티, 예제

sosal 2014. 7. 24. 02:50
반응형

/*

 * http://sosal.kr/

 * made by so_Sal

 */

 

 

http://sosal.tistory.com/105

 

스레드 개념에 대한 설명은 위 링크로 대신하겠습니다.

 

1. Thread의 실행

2. Property - IsBackground

3. Property - Priority

 

 

1. Thread의 실행

 

필요헤더:

using System.Threading;

 

 

스레드 생성 함수은 아래와같이 정의되어 있습니다.

 

public Thread (ThreadStart start [.int maxStackSize])

public Thread (ParameterizedThreadStart start [.int maxStackSize])

 

ThreadStart 함수는 파라미터가 존재하지 않을 때 간편하게 사용할 수 있는 함수이며

ParameterizedThreadStart 함수는 파라미터가 존재할 때 사용하는 함수입니다.

 

주의해야 할 점은 파라미터를 이용하는 스레드를 사용할 때, 스레드로 실행되는 function의 파라미터는

오직 Object 변수 하나만 있어야 한다는 것입니다.

 

 

 

//////// 메인 함수에서 5개의 Thread_function 함수를 동시에 실행하는 프로그램

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Threading;

 

class Program

    {

        static void Thread_Function(Object number)

        {//ParameterizedThreadStart 를 이용하기 위해선 Parameter는 Object 하나여야 한다.

            int number_thread = (int)number;

            Console.WriteLine(number_thread + " Thread start()");

            Thread.Sleep(500);

            Console.WriteLine(number_thread + " Thread processing()");

            Thread.Sleep(500);

            Console.WriteLine(number_thread + " Thread End()");

        }//3번의 출력을 하는 스레드 함수

 

        static void Main(string[] args)

        {

            Thread[] T = new Thread[5];

            for (int thread_number = 0; thread_number < 5; thread_number++)

            {

                T[thread_number] = new Thread(new ParameterizedThreadStart(Thread_Function));

                T[thread_number].Start(thread_number);

            }

            for (int thread_number = 0; thread_number < 5; thread_number++)

                T[thread_number].Join();

        }

    }

 



 

결과를 보시면 Thread_Function에 해당되는 함수 5개가 동시에 실행되는것을 볼 수 있습니다.

CPU 스케쥴링에 따라서 함수 실행의 순번도 달라지는걸 확인하실 수 있습니다.

 

 

 

2. Property - IsBackground

 

C# 스레드 프로세싱에서는 전경스레드와 배경스레드로 구분된다.

 

* 전경스레드

하나의 프로세스에서 전경스레드가 남아있다면 프로그램은 종료되지 않는다. 

모든 전경스레드의 종료를 기다리기 때문에, 메인함수에서 return을 하더라도 프로그램은 종료되지 않는다.)

 

* 배경스레드

이에 비해 배경스레드는 프로세스의 종료에 별다른 영향을 주지 않는다.

프로세스가 종료될 때 배경스레드가 남아 있더라도 프로그램은 종료된다.

 

스레드 생성에서 Default = 전경스레드 이기 때문에, 배경스레드로 바꾸고 싶다면

IsBackground 프로퍼티를 true로 변경해주면 된다.

 

 

-------------------------------------------------------------------------

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Threading;

 

class Program

    {

        static void Thread_Function(Object number)

        {//ParameterizedThreadStart 를 이용하기 위해선 Parameter는 Object 하나여야 한다.

            int number_thread = (int)number;

            Console.WriteLine(number_thread + " Thread start()");

            Thread.Sleep(500);

            Console.WriteLine(number_thread + " Thread processing()");

            Thread.Sleep(500);

            Console.WriteLine(number_thread + " Thread End()");

        }//3번의 출력을 하는 스레드 함수

 

        static void Main(string[] args)

        {

            Thread[] T = new Thread[5];

            for (int thread_number = 0; thread_number < 5; thread_number++)

            {

                T[thread_number] = new Thread(new ParameterizedThreadStart(Thread_Function));

    //T[thread_number].IsBackground = true;

                T[thread_number].Start(thread_number);

            }

Thread.Sleep(500);

return; //스레드 생성후 바로 종료함에도 불구하고 첫번쨰 예제와 같은 결과를 출력.

        }

    }

 



 

 

2번쨰 예제의 주석처리 된 T[thread_number].IsBackground = true; 까지 실행시켜 준다면 결과는 다음과 같다.

 



 

 

-------------------------------------------------------------------------

 

3. Property - Priority

 



 

위 예제에서 사용하던 Thread[] T 를 이용하였기 때문에 스레드변수 T에 thread_number를 붙여주었습니다.

 

 



 

ThreadPriority란 녀석의 정의를 보면 다음과 같이 되어있습니다.

Lowest = 0,

BelowNormal = 1,

Normal = 2,

AboveNormal = 3,

Highest = 4,

 

 

 

Thread 안의 Priority 변수에 숫자를 바로 넣어주셔도 되고

다음과 같이 enum 목록의 네임들을 사용해주셔도 무방합니다.