上午回答过你的一个问题,这次看到你还在研究多线程的问题,就这个问题说一下我的理解吧。
可能原因:自定义方法Threading()是在UI主线程空闲上执行,而timer_Elapsed是在线程池当中的一个线程上执行,两者执行时很可能在执行 void timer_Elapsed(object sender)
{
t = new Thread(new ThreadStart(Threadp)); //实例化线程
//线程池当中的线程执行到这里时,UI主线程执行Threading()的 t.Abort();//关闭线程
t.Start();//启动线程
}
解决:你将所有方法都用try括起来,捕获异常信息,你一看就明白了。
建议:你一秒刷新一次TextBox控件,为什么要建一个Thread呢?(这个是很消耗资源的),可以像下面这样写。同时还可以查看this.Invoke和this.BeginInvoke的区别。这个还可以使用BackgroundWorker来完成这个功能。
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Timer timer1 = new System.Threading.Timer(new TimerCallback(timer_Elapsed), null, 0, 1000);
//将这个d定义字段,放到方法外部
setText d = new setText(Threading); //实例化一个委托
}
void timer_Elapsed(object sender)
{
this.Invoke(d); //在拥用此控件的基础窗体句柄的线程上执行指定的委托
}
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Timer timer1 = new System.Threading.Timer(new TimerCallback(timer_Elapsed), null, 0, 1000);
GC.KeepAlive(timer1);
}
timer被回收了,加这个GC.KeepAlive(timer1);我以前也遇到过,这么解决的