オプション 1:
スレッド制御メソッドを呼び出します。 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 は非推奨になりました。Monitor、Mutex、Event、Semaphore などの System.Threading の他のクラスを使用して、スレッドを同期したりリソースを保護してください (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,线程继续}
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(); // 继续}
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 += "线程已结束"; } });
[]
以上がC#のスレッド制御例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。