可以使用Thread.Suspend和Thread.Resume这两个方法。
namespace ThreadSuspended { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void text() { for (int i = 0; i < 100000; i++) { Invoke(new Action(() => txt_Count.Text = i.ToString())); //txt_Count.Text = i.ToString(); } } private Thread th; private void Btn_Start_Click(object sender, EventArgs e) { th = new Thread(new ThreadStart(text)); th.Start(); th.IsBackground = true;//使th为后台线程在关闭Form1时后台线程一起关闭,如果前台线程则不被关闭引发错误 } private void Btn_Pause_Click(object sender, EventArgs e)//暂停按钮 { if (th.ThreadState != ThreadState.Suspended)//如果线程没有挂起 { //挂起线程 th.Suspend(); } } private void Btn_Continue_Click(object sender, EventArgs e)//继续按钮 { if (th != null && th.ThreadState != ThreadState.Running ) { //继续运行 th.Resume(); } } } }
如图(一)所示
使用ManualResetEvent, ManualResetEvent 是一个类它会通知一个或多个正在等待的线程已发生事件。 此类不能被继承。
namespace ThreadSuspended { public partial class Form1 : Form { public Form1() { InitializeComponent(); } ManualResetEvent mre = new ManualResetEvent(true); private void text() { for (int i = 0; i < 100000; i++) { mre.WaitOne(); Invoke(new Action(() => txt_Count.Text = i.ToString())); //txt_Count.Text = i.ToString(); } } private Thread th; private void Btn_Start_Click(object sender, EventArgs e) { th = new Thread(new ThreadStart(text)); th.Start(); th.IsBackground = true;//使th为后台线程在关闭Form1时后台线程一起关闭,如果前台线程则不被关闭引发错误 } private void Btn_Pause_Click(object sender, EventArgs e)//暂停按钮 { mre.Reset(); } private void Btn_Continue_Click(object sender, EventArgs e)//继续按钮 { mre.Set(); } } }
效果如图一所示结果一样,与方法一不一样的是在for循环中加入mre.WaitOne();这段代码的作用就是
// 摘要: // 阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。 // // 返回结果: // 如果当前实例收到信号,则为 true。 如果当前实例永远收不到信号,则 System.Threading.WaitHandle.WaitOne(System.Int32,System.Boolean) // 永不返回。 // // 异常: // T:System.ObjectDisposedException: // 当前实例已被释放。 // // T:System.Threading.AbandonedMutexException: // 线程退出时未释放互斥体,等待过程已终止。 在 Windows 98 或 Windows Millennium Edition 中不引发此异常。 // // T:System.InvalidOperationException: // 当前实例是另一个应用程序域中的 System.Threading.WaitHandle 的透明代理。
联系客服