C #에서 스레드로 작업하는 방법

스레드는 프로세스 내에서 가장 작은 실행 단위입니다. 멀티 스레딩은 주어진 시간에 여러 스레드를 메모리에두고 동시에 여러 작업을 처리하기 위해 스레드간에 전환 할 수있는 기능입니다. Microsoft의 .Net Framework는 스레드 작업에 대한 탁월한 지원을 제공합니다.

C #의 프로그래밍 스레드

스레드로 작업하려면 애플리케이션에 System.Threading 네임 스페이스를 포함해야합니다. 새 스레드를 만들려면 ThreadStart 대리자를 활용하고 스레드에서 실행해야하는 메서드에 대한 참조를 전달해야합니다. 대리자는 형식이 안전한 함수 포인터입니다. 다음 코드 조각은이 대리자를 사용하여 새 스레드 개체를 만드는 방법을 보여줍니다.

 스레드 t = new Thread (new ThreadStart (MyThreadMethod)); 

새로 생성 된 스레드를 시작하려면 생성 한 스레드 개체에서 Start 메서드를 호출해야합니다. 다음 코드 목록은이를 보여줍니다. 스레드 메서드 MyThreadMethod는 생성 된 새 스레드 (작업자 스레드라고 함)에서 실행됩니다.

 정적 무효 Main ()

        {

            스레드 t = new Thread (new ThreadStart (MyThreadMethod));

            t.Start ();           

            Console.Read ();

        }

        정적 무효 MyThreadMethod ()

        {

            Console.WriteLine ( "Hello World!");

        }

C #에서 스레드 상태 표시

메모리의 스레드는 중단됨, 백그라운드, 실행 중, 중지됨, 일시 중단됨, 시작되지 않음 등 다양한 상태 일 수 있습니다. 스레드 상태는 System.Threading 네임 스페이스에서 사용할 수있는 ThreadState 열거 형에 정의됩니다. Start 메서드가 스레드에서 호출되지 않는 한 스레드는 Unstarted 상태입니다. 스레드 인스턴스에서 Start 메서드가 호출되면 스레드의 상태가 Unstarted에서 Running으로 변경됩니다.

다음 코드 조각은 콘솔에 스레드 상태를 표시하는 방법을 보여줍니다.

 스레드 t = new Thread (new ThreadStart (MyThreadMethod));

t.Start ();

Console.WriteLine (“스레드의 상태 :“+ t.ThreadState.ToString ());

C #에서 포 그라운드 및 백그라운드 스레드 제어

스레드는 포 그라운드 또는 백그라운드에서 실행될 수 있습니다. 명시 적으로 생성하는 스레드는 포 그라운드 스레드입니다. 포 그라운드 스레드와 백그라운드 스레드의 주요 차이점 중 하나는 애플리케이션이 하나 이상의 포 그라운드 스레드가 실행되는 동안 만 유지된다는 것입니다. 본질적으로 포 그라운드 스레드는 애플리케이션이 종료되는 것을 방지합니다. 반대로 백그라운드 스레드는 공용 언어 런타임 환경을 유지하지 않습니다.

IsBackground 속성을 사용하여 스레드의 백그라운드 상태를 설정할 수 있습니다. 다음은이를 달성하는 방법을 보여주는 코드 예제입니다.

 정적 무효 Main ()

        {

            스레드 t = new Thread (new ThreadStart (MyThreadMethod));

            t.Start ();

            t.IsBackground = true;

            Console.WriteLine (“스레드의 백그라운드 상태 :“+ t.IsBackground.ToString ());

            Console.Read ();

        }

스레드 객체에서 Suspend () 및 Resume () 메서드를 호출하여 스레드를 일시 중단하거나 다시 시작할 수 있습니다. Suspend () 메서드를 호출하여 이전에 일시 중단 한 스레드 만 다시 시작할 수 있습니다.

 스레드 t = new Thread (new ThreadStart (MyThreadMethod));

t.Start ();

t.Suspend (); // 새로 생성 된 스레드를 일시 중단합니다.

t.Resume (); // 중단 된 스레드를 다시 시작합니다.

그러나 Thread.Suspend () 및 Thread.Resume () 메서드는 더 이상 사용되지 않습니다. 대신 AutoResetEvent 및 EventWaitHandle 메서드를 사용하여 스레드와 관련된 활동을 동기화해야합니다.

C #에서 스레드 우선 순위 설정

스레드의 우선 순위를 제어하여 스레드가 메모리에 상주하는 다른 스레드와 비교할 프로세서 시간의 상대적인 공유를 결정할 수 있습니다. 스레드 우선 순위는 ThreadPriority 열거에 정의됩니다. 가능한 값은 최저, 보통 이하, 보통, 보통 이상, 최고입니다. 다음 코드 조각은 스레드 객체의 Priority 속성을 사용하여 두 스레드의 스레드 우선 순위를 설정하는 방법을 보여줍니다.

 정적 무효 Main ()

        {

            스레드 thread1 = new Thread (new ThreadStart (Method1));

            스레드 thread2 = new Thread (new ThreadStart (Method2));

            thread1.Priority = ThreadPriority.Highest;

            thread2.Priority = ThreadPriority.Lowest;

            thread2.Start ();

            thread1.Start ();

            Console.Read ();

        }

        정적 무효 Method1 ()

        {

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

            {

                Console.WriteLine (“첫 번째 스레드 :“+ i);

            }

        }

        정적 무효 Method2 ()

        {

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

            {

                Console.WriteLine (“두 번째 스레드 :“+ i);

            }

        }

위의 코드 조각을 실행하면 Main 메서드의 첫 번째 스레드 이전에 두 번째 스레드가 시작 되었더라도 첫 번째 스레드가 두 번째 스레드보다 먼저 실행을 완료하는 것을 볼 수 있습니다.

스레드는 비싸다. 초기화, 컨텍스트 전환 및 사용하는 리소스 해제를 위해 시스템에서 많은 리소스를 소비합니다. 따라서 멀티 스레딩은 필요할 때만 신중하게 사용해야합니다. 멀티 스레딩을 활용하는 경우 항상 스레드 풀을 활용하여 필요에 따라 스레드를 생성 및 관리하고 애플리케이션의 응답 성을 개선하는 것이 좋습니다.