Option 1:
Aufrufen der Thread-Steuerungsmethode Start: Thread.Start(); Stop: Thread . Abort();Pause:Thread.Suspend();Weiter: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(); // 继续}
Threads sind definiert als:
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); } });
Es ist bemerkenswert dass: Threads durch Thread.Abort() gestoppt wurden (Oder ein Thread, der von selbst endet) kann nicht direkt über die Thread.Start()-Methode erneut gestartet werden, und zum Starten muss ein neuer Thread erstellt werden.
Das „Start Button“-Ereignis sollte also sein:
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(); // 开始}
Außerdem gilt für die Methoden Thread.Suspend() und Thread.Resume(): Microsoft hat Es ist als veraltet markiert:
Thread.Suspend wurde veraltet. Bitte verwenden Sie andere Klassen in System.Threading, z. B. Monitor, Mutex, Event. und Semaphore, um Threads zu synchronisieren oder Ressourcen zu schützen)Da es keine Möglichkeit gibt, festzustellen, welcher Code ausgeführt wird, wenn der Thread derzeit angehalten ist. Wenn der Thread, der die Sperre hält, während der Auswertung der Sicherheitsberechtigungen angehalten wird, werden möglicherweise andere Threads im AppDoamin blockiert. Wenn Sie einen Thread anhalten, während er den Konstruktor ausführt, werden andere Threads in der AppDomain, die versuchen, die Klasse zu verwenden, blockiert. Dies ist anfällig für Deadlocks.
Option 2: Bestimmen Sie, ob an einem geeigneten Punkt im Thread-Ausführungsprozess fortgefahren werden soll (z. B. nach einer vollständigen Funktion/einem vollständigen Befehl). Thread, und bestimmen Sie dann das Schicksal des Threads.
1. Definieren Sie eine globale Variable:
int
mTdFlag = 0; // 1: Normaler Betrieb; 2: Pause 3: Stopp; 2. Definieren Sie eine Beurteilungsmethode:
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 += "线程已结束"; } });
Code im Formularkonstruktor hinzufügen: Control.CheckForIllegalCrossThreadCalls = false;
[]
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen zur C#-Thread-Steuerung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!