C# Threading.Timer 为什么过了一会儿自己停了

最近咱一研究Threading.Timer,因为之前的Forms.Timer总是会出现卡屏的现象,所以觉得改用Threading.timer,可是我从网上找了一下方法,但... 最近咱一研究Threading.Timer,因为之前的Forms.Timer 总是会出现卡屏的现象,所以觉得改用Threading.timer,可是我从网上找了一下方法,但是出现了一些问题,想向大家请教,我的源代码如下:
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Timer timer1 = new System.Threading.Timer(new TimerCallback(timer_Elapsed), null, 0, 1000);
}

Thread t; //定义线程变量
private delegate void setText();//定义一个线程委托
//自定义方法Threadp,主要用于线程的调用
public void Threadp()
{
setText d = new setText(Threading); //实例化一个委托
this.Invoke(d); //在拥用此控件的基础窗体句柄的线程上执行指定的委托
}
//自定义方法Threading,主要作于委托的调用
public void Threading()
{
textBox1.Text = DateTime.Now.ToString();
t.Abort();//关闭线程
}

void timer_Elapsed(object sender)
{
t = new Thread(new ThreadStart(Threadp)); //实例化线程
t.Start();//启动线程
}
程序的功能即在TextBox中显示当前时间,一秒一刷新,但是呢,我测试了一些,发现Timer启动后,64s后就自己停止了,不知道为什么,各位大侠给瞧瞧。
展开
 我来答
whm412
2013-09-22 · TA获得超过515个赞
知道小有建树答主
回答量:289
采纳率:66%
帮助的人:281万
展开全部
上午回答过你的一个问题,这次看到你还在研究多线程的问题,就这个问题说一下我的理解吧。
可能原因:自定义方法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); //在拥用此控件的基础窗体句柄的线程上执行指定的委托
}
追问
这只是一个测试软件,实际上我是要在Timer中执行数据库操作及IO操作,很多东西,所以实际当中,开启一个线程还会消耗资源吗?我的目的就是为了解决,Forms.Timer卡的问题,现在Threading.Timer,我发现出现执行60次左右就停止的现象,所以就有点不知道怎么回事了。我试试你的方法吧,感谢你。
赢桓
2013-09-22 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:73
采纳率:100%
帮助的人:55.3万
展开全部
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);我以前也遇到过,这么解决的
追问
非常感谢,我最后还是通过System.Threading.Timer timer1(全局),然后timer1 = new System.Threading.Timer(new TimerCallback(timer_Elapsed), null, 0, 1000);

这样就不会回收了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式