问题:单击一个按钮,让线程运行,做一个50000之内的数循环,让一个TextBox显示每一个当前的循环数字。当线程正在运行时,如果第二次或者多次单击按钮,让线程重头开始运行。怎么办?,经过几次试验,代码如下:
线程只有一个在运行,不会产生多个线程,因为线程是再Abort()后,重新新的线程的。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication18 { public partial class Form1 : Form { public Form1() { InitializeComponent(); _ThreadCur = new Thread(new ThreadStart(RunPic)); } /// <summary> /// 主线程 /// </summary> Thread _ThreadCur = null; private void btStart_Click(object sender, EventArgs e) { //判断线程是否活动,如果活动,终止线程 if (_ThreadCur.IsAlive == true) { //线程终止 _ThreadCur.Abort(); } //如果线程状态没有开始,那么开始线程 if (_ThreadCur.ThreadState == ThreadState.Unstarted) { _ThreadCur.Start(); } //如果线程停止了,需要重建线程,然后开始。终止的线程不能启动 if (_ThreadCur.ThreadState == ThreadState.Stopped) { _ThreadCur = new Thread(new ThreadStart(RunPic)); _ThreadCur.Start(); } } public void RunPic() { for (int i = 0; i < 500; i++) { if (this.txtShowNum.InvokeRequired) { this.Invoke(new setLabHandle(setLabeText), new object[] { i.ToString() }); } else { setLabeText(i.ToString()); } Thread.Sleep(10); } } public delegate void setLabHandle(string pText); private void setLabeText(string pText) { this.txtShowNum.Text = pText; } }
程序实现了上述功能,但是问题出在,当线程没有运行完毕时,如果关闭窗体,则系统报错,错误内容为
:“无法访问已释放的对象。”
如图所示:
解决办法有两种:
(1)在this.Invoke出,把Invoke替换为BeginInvoke
代码如下:
public void RunPic() { for (int i = 0; i < 500; i++) { if (this.txtShowNum.InvokeRequired) { //this.Invoke(new setLabHandle(setLabeText), new object[] { i.ToString() }); //把Invoke替换为BeginInvoke this.BeginInvoke(new setLabHandle(setLabeText), new object[] { i.ToString() }); } else { setLabeText(i.ToString()); } Thread.Sleep(10); } }
(2)在关闭窗体事件中,判断_ThreadCur是否活动,如果活动,那么终止,代码如下:
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (_ThreadCur != null && _ThreadCur.IsAlive) { _ThreadCur.Abort(); } }
作者:
cglnet
本文版权归cglNet和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.