C\#다 중 스 레 드 의 Thread 클래스 상세 설명

System.Threading.Thread 클래스 를 사용 하면 스 레 드 를 만 들 고 제어 할 수 있 습 니 다.
자주 사용 하 는 구조 함 수 는 다음 과 같다.

 //   : 
  //      System.Threading.Thread      ,                    。
  //
  //   : 
  // start:
  //  System.Threading.ParameterizedThreadStart   ,                 。
  //
  //   : 
  // System.ArgumentNullException:
  //  start   null。
  [SecuritySafeCritical]
  public Thread(ParameterizedThreadStart start);
  //
  //   : 
  //      System.Threading.Thread      。
  //
  //   : 
  // start:
  //  System.Threading.ThreadStart   ,                 。
  //
  //   : 
  // System.ArgumentNullException:
  //  start     null。
  [SecuritySafeCritical]
  public Thread(ThreadStart start);
1.매개 변수 없 이 스 레 드 만 들 기
ThreadStart 의뢰 는 형식 비트 void 를 되 돌려 주 는 매개 변수 없 는 방법 을 정의 합 니 다.

public void Main()
  {
   Thread vThread = new Thread(ThreadFun);
   //vThread.Name = "td_Name"; //     
   vThread.Start(); //      
   Console.WriteLine("This is the main thread:id=" + Thread.CurrentThread.ManagedThreadId);
  }

  void ThreadFun() //     :ThreadStart 
  {
   Console.WriteLine("Running in a new thread:id=" + Thread.CurrentThread.ManagedThreadId);
   for (int i = 0; i < 10; i++)
   {
    Console.Write(".");
    Thread.Sleep(500);
   }
   Console.WriteLine("THREAD END");
  }

출력 결과:

상소 코드 의 ThreadFun()을 Lambda 표현 식 으로 대체 하여 Thread 의 간편 한 사용 방식 으로 바 꿉 니 다.

 public void Main()
  {
   Thread vThread = new Thread(() =>
   {
    Console.WriteLine("Running in a new thread");
   });
   //vThread.Name = "td_Name"; //     
   vThread.Start(); //      
   Console.WriteLine("This is the main thread");
  }
2.스 레 드 에 매개 변 수 를 전달 합 니 다.
두 가지 방식:하 나 는 Parameterized ThreadStart 의뢰 를 가 진 방법 으로 매개 변수 구조 Thread 를 사용 하 는 것 입 니 다.다른 하 나 는 사용자 정의 클래스 를 만 들 고 스 레 드 방법 을 인 스 턴 스 방법 으로 정의 하 는 것 입 니 다.먼저 인 스 턴 스 의 데 이 터 를 초기 화하 고 스 레 드 를 시작 합 니 다.
전달 매개 변수

public struct TdData //     
  {
   public string Message; //  string  
  }
첫 번 째 방법 사용:

 public void Main()
  {
   TdData tData = new TdData() { Message = "Thread Info" };
   Thread vThread = new Thread(ThreadFun);
   vThread.Start(tData); //       ,    
   Console.WriteLine("This is the main thread");
  }

  void ThreadFun(object pObj) //     :ParameterizedThreadStart 
  {
   TdData vData = (TdData)pObj;
   Console.WriteLine("In a new thread, Received:{0}", vData.Message);   
  }

두 번 째 방식 사용:클래스 를 먼저 정의 합 니 다.

public class TdHelper
 {
  public TdData mData; //     

  //     
  public TdHelper(TdData pData)
  {
   this.mData = pData;
  }

  public void ThreadFun() //     :ThreadStart 
  {
   Console.WriteLine("In a new thread, TdDataMessage:{0}", mData.Message);
  }
 }

그리고 메 인 스 레 드(필요 한 곳)에 Thread 를 만 들 고 인 스 턴 스 방법 TdHelper.ThreadFun()을 구조 함수 의 매개 변수 로 합 니 다.

public void Main()
  {
   TdData tData = new TdData() { Message = "Thread Info" };
   TdHelper tHelper = new TdHelper(tData); //     
   Thread vThread = new Thread(tHelper.ThreadFun);
   vThread.Start();
   Console.WriteLine("This is the main thread");
}
3.백 스테이지 스 레 드
기본 적 인 상황 에서 Thread 류 가 만 든 스 레 드 는 프론트 스 레 드 이 고 스 레 드 탱크 의 스 레 드 는 항상 백 스테이지 스 레 드 입 니 다.하나의 프론트 스 레 드 가 실행 되 기만 하면 프로그램의 프로 세 스 가 실 행 됩 니 다.여러 개의 프론트 스 레 드 가 실행 되 고 Main()방법 이 끝나 면 프로그램 은 모든 프론트 스 레 드 가 작업 을 완성 할 때 까지 활성화 되 어 있 습 니 다.
Thread 클래스 인 스 턴 스 의 IsBackground 속성 을 설정 하여 배경 스 레 드 로 만 들 수 있 습 니 다.

public void Main()
  {
   Thread vThread = new Thread(() =>
   {
    Console.WriteLine("New thread started"); // Title3
    Thread.Sleep(5000);
    Console.WriteLine("New thread completed"); // Title2
   });
   //vThread.IsBackground = true;
   vThread.Start();
   Console.WriteLine("This is the main thread"); // Title1
  }

 IsBackground 속성 이 기본적으로 false 일 때 콘 솔 에서 3 개의 출력 정 보 를 완전 하 게 볼 수 있 습 니 다.그러나 트 루 로 설정 하면 세 번 째 정보(Title 2)가 출력 될 때 까지 기다 리 지 않 고 메 인 스 레 드 Main()이 실행 되면 콘 솔 창 이 자동 으로 닫 힙 니 다.
4.스 레 드 우선 순위
Priority 속성 을 통 해 Thread 클래스 인 스 턴 스 의 우선 순 위 를 조정 할 수 있 습 니 다.기본 값 은:vThread.Priority=ThreadPriority.Normal;/매 거 값
관계:Highest>aboveNormal>Normal>BelowNormal>Lowest
5.제어 라인
Thread 대상 의 Start()방법 을 호출 하면 스 레 드 를 만 들 수 있 습 니 다.그러나 Start()방법 을 호출 한 후에 도 새 스 레 드 는 Running 상태 가 아니 라 Unstarted 상태 입 니 다.운영 체제 의 스 레 드 스케줄 러 만 이 스 레 드 를 실행 할 것 을 선택 하면 스 레 드 는 Running 상태 로 변 경 됩 니 다.Thread.ThreadState 속성 을 통 해 이 스 레 드 의 현재 상 태 를 얻 을 수 있 습 니 다.
Thread.sleep()방법 을 사용 하면 스 레 드 를 WaitSleepJoin 상태 로 만 들 고 Sleep()방법 이 정 의 된 시간 대 를 거 친 후에 스 레 드 는 다시 운영 체제 에 배 치 될 때 까지 기 다 립 니 다.
스 레 드 를 멈 추 려 면 Thread.Abort()방법 을 사용 할 수 있 습 니 다.이 방법 을 사용 하면 종료 명령 을 받 은 스 레 드 에 ThreadAbortException 을 던 져 서 처리 프로그램 으로 이 이상 을 포착 합 니 다.스 레 드 는 끝나 기 전에 청 소 를 완료 할 수 있 습 니 다.스 레 드 는 Thread.Abort()방법 을 호출 한 결 과 를 받 은 후에 도 계속 작업 할 수 있 습 니 다.스 레 드 가 초기 화 되 지 않 으 면 종료 요청 을 받 은 스 레 드 의 상 태 는 Abortrequired 에서 Aborted 로 변 경 됩 니 다.
스 레 드 가 끝 날 때 까지 기다 리 려 면 Thread.Join()방법 을 사용 할 수 있 습 니 다.현재 스 레 드 를 중단 하고 가입 한 스 레 드 가 완 료 될 때 까지 WaitSleepJoin 상태 로 설정 합 니 다.
참조:C\#다 중 스 레 드 제어 상세 설명
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기