线程计时工作,挂起时如何确保从头执行。

cs1438250 2016-01-19 02:33:30
winform窗口初始化的时候,start后台线程T。
T里有很多方法要执行
方法1
方法2
方法3
……
方法20 假如是20个。

有一个button,点击的时候,要把T挂起,但是如何保障挂起的时候,方法20执行完毕,而不是执行到方法6或者其他就挂起。
恢复线程时,希望从方法1开始执行,而不是接着方法7开始执行。
...全文
217 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
看了大家的讨论,学习了。
一条牛 2016-07-15
  • 打赏
  • 举报
回复
stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。 用Thread.stop()方法来终止线程将会释放该线程对象已经锁定的所有监视器。如果以前受这些监视器保护的任何对象都处于不连贯状态,那么损坏的对象对其他线程可见,这有可能导致不安全的操作。 由于上述原因,因此不应该使用stop()方法,而应该在自己的Thread类中置入一个标志,用于控制目标线程是活动还是停止。如果该标志指示它要停止运行,可使其结束run()方法。如果目标线程等待很长时间,则应使用interrupt()方法来中断该等待。 suspend()方法 该方法已经遭到反对,因为它具有固有的死锁倾向。调用suspend()方法的时候,目标线程会停下来。如果目标线程挂起时在保护关键系统资源的监视器上保持有锁,则在目标线程重新开始以前,其他线程都不能访问该资源。除非被挂起的线程恢复运行。对任何其他线程来说,如果想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。由于上述原因,因此不应该使用suspend()方法,而应在自己的thread类中置入一个标志,用于控制线程是活动还是挂起。如果标志指出线程应该挂起,那么用wait()方法命令其进入等待状态。如果标志指出线程应当恢复,那么用notify()方法重新启动线程。
一条牛 2016-07-15
  • 打赏
  • 举报
回复
我不是需要的事多少秒执行一次,而是我有很多任务,(比如说我有1万个文件需要下载,如果不使用线程?我是不是需要一个个下,一个个任务去执行,如果我使用线程?那就是我开20个线程,就是20个线程同时下载?)
cs1438250 2016-01-19
  • 打赏
  • 举报
回复
引用 8 楼 johnliuyuan 的回复:
是啊,20个方法都执行完,线程不久该结束了吗?何来挂起之说啊
20个方法要循环执行,每10秒执行一次,上面简写了。 我还能不知道循环完事线程结束么。
john_QQ:2335298917 2016-01-19
  • 打赏
  • 举报
回复
是啊,20个方法都执行完,线程不久该结束了吗?何来挂起之说啊
cs1438250 2016-01-19
  • 打赏
  • 举报
回复
线程里肯定有 循环的,while(Flag) 也有Thread.Sleep(xxxx); 因为工作时间比较长,可能一两个月不关机,所以不想用timer。 假定10秒执行一次,也是Thread.Sleep(10000); 方法1-20是向多个表里存数据,所以用后台线程。 换个问法,点按钮挂起这个线程的时候,本次while(Flag)是否执行完才挂起。
  • 打赏
  • 举报
回复
“挂起”的原因,十有八九是 UI 窗体响应用户操作的体验太卡了。 而一个交互程序(而非明确知道的挂机耗资源的程序)还要弄20个“后台”线程一直在那里死循环者,反过来又说明再设计时有滥用线程的习惯。
  • 打赏
  • 举报
回复
看上去很花哨的所谓“多线程、定时工作”,这个习惯,从一开始就要把人家原本执行性能有保障的项目产品这一锅鲜汤里边,放上性能的老鼠屎了。
  • 打赏
  • 举报
回复
首先,交互式系统的编程以事件驱动机制(这是具体的技术,以及各种组件中有几十万、上百万个现成的实现,几乎每一种组件的每一个实例都会抛出多个事件)为出发点,不是你随便整一堆线程去“监控”所谓事件。 其此,线程要执行的过程,通常几十毫秒就结束了。如果你纠结“死循环”的编程思路,那么结合你滥用线程(windows下每一个线程都至少占用1M内存栈空间,占用CPU调度时间),将会形成恶性循环,你需要要更多诡异和蹩脚的代码来“控制”你的“监控”的后果。 每当需要线程(系统线程池分配)时,就是几十毫秒的事情要干一下,然后就结束了。哪有什么循环?
  • 打赏
  • 举报
回复
1~20全部都要执行完,那你哪有挂起的概念?
Poopaye 2016-01-19
  • 打赏
  • 举报
回复
那你根本不需要挂起和恢复 线程执行完毕会自动退出 下次重启新线程
xdashewan 2016-01-19
  • 打赏
  • 举报
回复
按钮控制一个标志位,线程每次执行1-20方法,执行完了判一下标志位是否要重来再来一次,是就再来。原理很简单,但写起来优劣差别很大,简单但比较差的做法是循环,写的好点可以利用thread.timer,当然还有很多别的方式,我也懒得一个个去想了

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧