永发信息网

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

答案:2  悬赏:10  手机版
解决时间 2021-04-03 02:39
  • 提问者网友:你独家记忆
  • 2021-04-02 11:57
C# Threading.Timer 为什么过了一会儿自己停了
最佳答案
  • 五星知识达人网友:傲气稳了全场
  • 2021-04-02 12:35
上午回答过你的一个问题,这次看到你还在研究多线程的问题,就这个问题说一下我的理解吧。
可能原因:自定义方法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次左右就停止的现象,所以就有点不知道怎么回事了。我试试你的方法吧,感谢你。
全部回答
  • 1楼网友:拜訪者
  • 2021-04-02 12:57
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);
这样就不会回收了。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯