집 >백엔드 개발 >C#.Net 튜토리얼 >C# 스레드 제어 예제에 대한 자세한 설명
옵션 1:
스레드 제어 메서드를 호출합니다. 시작: Thread.Start(); Stop: Thread.Abort(); Continue: 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\n", DateTime.Now.ToString(), vSum); Thread.Sleep(1000); } }catch (ThreadAbortException ex) { Console.WriteLine("ThreadAbortException:{0}", ex.Message); } });
따라서 "시작 버튼" 이벤트는 다음과 같아야 합니다.
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\n", DateTime.Now.ToString(), vSum); Thread.Sleep(1000); } }catch (ThreadAbortException ex) { Console.WriteLine("ThreadAbortException:{0}", ex.Message); } }); mThread.Start(); // 开始}또한 Thread.Suspend() 및 Thread.Resume() 메서드의 경우 Microsoft는 해당 메서드를
Thread로 표시했습니다. Suspend는 더 이상 사용되지 않습니다. 스레드를 동기화하거나 리소스를 보호하려면 System.Threading의 다른 클래스(예: Monitor, Mutex, Event 및 Semaphore)를 사용하십시오. (
Thread.Suspend 는 더 이상 사용되지 않습니다. System.Threading에서 다른 클래스를 사용하십시오. , 스레드를 동기화하거나 리소스를 보호하기 위한 모니터, 뮤텍스, 이벤트 및 세마포어 등) 현재 일시 중지된 스레드가 어떤 코드를 실행하고 있는지 알 수 있는 방법이 없기 때문입니다. 보안 권한 평가 중에 잠금을 보유하는 스레드가 일시 중단되면 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\n", 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 += "线程已结束"; } });양식에서 크로스 스레드 액세스 문제를 해결합니다.
In the 양식 생성자 코드 추가: Control.CheckForIllegalCrossThreadCalls = false;
[]
위 내용은 C# 스레드 제어 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!