方法一
可以使用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();
}
}
}
}
如图(一)所示
这里面要注意的是调用文本框txt_Count必须要使用委托的方法Invoke(new Action(() => txt_Count.Text = i.ToString()));
开始控件名称: btn_Start 开始事件:Btn_Start_Click(object sender, EventArgs e)
暂停控件名称:btn_Pause 暂停事件:Btn_Pause_Click(object sender, EventArgs e)
继续控件名称:btn_Continue 继续事件:Btn_Continue_Click(object sender, EventArgs e)
方法二
使用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 的透明代理。