C\#다 중 스 레 드 제어 상세 설명

본 고 는 여러분 께 C\#다 중 스 레 드 의 스 레 드 통 제 를 공유 하 였 으 며,여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
프로젝트 1:
스 레 드 제어 방법 을 호출 합 니 다.시작:Thread.Start();정지:Thread.Abort();일시 정지:Thread.Suspend();계속:Thread.Resume();

 private void btn_Start_Click(object sender, EventArgs e)
    {
      mThread.Start(); //   
    }

    private void btn_Stop_Click(object sender, EventArgs e)
    {
      mThread.Abort(); //   
    }

    private void btn_Suspend_Click(object sender, EventArgs e)
    {
      mThread.Suspend(); //   
    }

    private void btn_Resume_Click(object sender, EventArgs e)
    {
      mThread.Resume(); //   
    }

스 레 드 정의:

mThread = new Thread(() =>
      {
        try
        {
          for (int j = 0; j < 20; j++)
          {
            int vSum = 0;
            this.textBox1.Text += "--->";
            for (int i = 0; i < 100000000; i++)
            {
              if (i % 2 == 0)
              {
                vSum += i;
              }
              else
              {
                vSum -= i;
              }
            }
            this.textBox1.Text += string.Format("{0} => vSum = {1}\r
", DateTime.Now.ToString(), vSum); Thread.Sleep(1000); } } catch (ThreadAbortException ex) { Console.WriteLine("ThreadAbortException:{0}", ex.Message); } });
주의해 야 할 것 은 Thread.Abort()를 통 해 멈 춘 스 레 드(또는 자체 실행 이 끝 난 스 레 드)를 통 해 Thread.Start()방법 으로 다시 시작 할 수 없습니다.스 레 드 를 다시 만들어 서 시작 해 야 합 니 다.
따라서'시작 버튼'사건 은 다음 과 같 아야 합 니 다.

private void btn_Start_Click(object sender, EventArgs e)
    {
      //     
      mThread = new Thread(() => // Lambda    
      {
        try
        {
          for (int j = 0; j < 20; j++)
          {
            int vSum = 0;
            this.textBox1.Text += "--->";
            for (int i = 0; i < 100000000; i++)
            {
              if (i % 2 == 0)
              {
                vSum += i;
              }
              else
              {
                vSum -= i;
              }
            }
            this.textBox1.Text += string.Format("{0} => vSum = {1}\r
", DateTime.Now.ToString(), vSum); Thread.Sleep(1000); } } catch (ThreadAbortException ex) { Console.WriteLine("ThreadAbortException:{0}", ex.Message); } }); mThread.Start(); // }
또한,Thread.Suspend()와 Thread.Resume()방법 에 대해 마이크로소프트 는 이 를 시대 에 뒤떨어 진 것 으로 표시 했다.
Thread.Suspend has been deprecated.  Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources.  http://go.microsoft.com/fwlink/?linkid=14202(Thread.Suspend 는 이미 부결 되 었 다.모니터,상호 배척 체,이벤트 와 신 호 량 등 시스템 의 다른 스 레 드 를 사용 하여 동기 스 레 드 나 자원 을 보호 하 십시오http://go.microsoft.com/fwlink/?linkid=14202
현재 스 레 드 가 걸 렸 을 때 어떤 코드 를 실행 하고 있 는 지 판단 할 수 없 기 때문이다.보안 권한 평가 기간 에 잠 금 이 있 는 스 레 드 를 걸 면 AppDoamin 의 다른 스 레 드 가 막 힐 수 있 습 니 다.온라인 프로그램 이 구조 함 수 를 실행 할 때 걸 면 AppDomain 에서 이러한 종류의 다른 스 레 드 를 사용 하려 고 시도 하 는 것 이 막 힐 것 입 니 다.이렇게 하면 자물쇠 가 생기 기 쉽다.
프로젝트 2:
스 레 드 가 실행 되 는 과정 에서 적당 한 위치(예 를 들 어 완전한 기능/명령 후)가 스 레 드 를 계속 할 지 여 부 를 판단 하고 스 레 드 의 운명 을 결정 합 니 다.
1.전역 변 수 를 정의 합 니 다:

int mTdFlag = 0; // 1:    ;2:  ;3:  
 2.판단 방법 을 정의 합 니 다.

bool WaitForContinue()
    {
      if (this.mTdFlag == 3)
      {
        return false; //   false,    
      }
      else if (this.mTdFlag == 2)
      {
        while (mTdFlag != 1)
        {
          Thread.Sleep(200); //    ;      ,   
          if (this.mTdFlag == 3)
          {
            return false; //   false,    
          }
        }
      }
      return true; //   true,    
    }
3.제어 명령 이벤트 수정:

 private void btn_Stop_Click(object sender, EventArgs e)
    {
      this.mTdFlag = 3;
      //mThread.Abort(); //   
    }

    private void btn_Suspend_Click(object sender, EventArgs e)
    {
      this.mTdFlag = 2;
      //mThread.Suspend(); //   
    }

    private void btn_Resume_Click(object sender, EventArgs e)
    {
      this.mTdFlag = 1;
      //mThread.Resume(); //   
    }

4.스 레 드 운행 과정 에서 적당 한 위치 에서 스 레 드 가 계속 되 는 지 판단 합 니 다.

 mThread = new Thread(() =>
      {
        try
        {
          for (int j = 0; j < 20; j++)
          {
            int vSum = 0;
            this.textBox1.Text += "--->";
            for (int i = 0; i < 100000000; i++)
            {
              if (i % 2 == 0)
              {
                vSum += i;
              }
              else
              {
                vSum -= i;
              }
              if (i % 10000000 == 0)
              {
                this.textBox1.Text += ".";
              }
              if (!WaitForContinue()) //    false  ,  
              {
                break;
                //return;
              }
            }
            this.textBox1.Text += string.Format("{0} => vSum = {1}\r
", DateTime.Now.ToString(), vSum); if (!WaitForContinue()) // false , { break; // return; } Thread.Sleep(1000); } } catch (ThreadAbortException ex) { Console.WriteLine("ThreadAbortException:{0}", ex.Message); this.textBox1.Text += ex.Message + "..."; } finally { this.textBox1.Text += " "; } });
창 에서 크로스 스 레 드 접근 문 제 를 해결 합 니 다:창 구조 함수 에 코드 를 추가 합 니 다:  Control.CheckForIllegalCrossThreadCalls = false;

좋은 웹페이지 즐겨찾기