>백엔드 개발 >C#.Net 튜토리얼 >C# 스레드 제어 예제에 대한 자세한 설명

C# 스레드 제어 예제에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-23 16:34:032234검색

옵션 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);
                }
            });
주의할 점은
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\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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.