挪用线程掌握要领.启动: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\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() 要领,微软已将其标记为过期:
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. (Thread.Suspend 已被反对。请运用体系中的其他类线程,如监视器、互斥体、事宜和信号量,以同步线程或庇护资本。)
由于,没法推断当前挂起线程时它正在实行什么代码。如果在平安权限评价时期挂起持有锁的线程,则 AppDoamin 中的别的线程能够被阻挠。如果在线程正实行组织函数时挂起它,则 AppDomain 中尝试运用该类的别的线程将被阻挠。如许容易发生死锁。
计划二:
在 线程运转过程当中 恰当的位置(如某个完全的功用/敕令后)推断是不是要继承线程,再决议线程的运气。
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 += "线程已完毕"; } });
在窗体中,处理跨线程接见题目:在窗体组织函数中增加代码: Control.CheckForIllegalCrossThreadCalls = false;
[]
以上就是C#线程掌握的实例详解的细致内容,更多请关注ki4网别的相干文章!