栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

比较使用Thread.Sleep和Timer延迟执行

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

比较使用Thread.Sleep和Timer延迟执行

一个区别是

System.Threading.Timer
在线程池线程上调度回调,而不是每次都创建一个新线程。如果您需要在应用程序的生命周期内多次执行此操作,则可以节省创建和销毁一堆线程的开销(如您所引用的文章所述,此过程非常耗资源),因为它将只需重用池中的线程,如果一次要使用多个计时器,这意味着您一次运行的线程会更少(也节省了大量资源)。

换句话说,

Timer
它将更加高效。它也可能更准确,因为
Thread.Sleep
只保证您指定的时间最少就可以等待(操作系统可能会使它进入更长时间的睡眠)。当然,
Timer
仍然不能完全准确,但是目的是在尽可能接近指定的时间触发回调,但这不一定是的目的
Thread.Sleep

至于销毁

Timer
,回调函数可以接受参数,因此您可以将
Timer
自身作为参数传递,并在回调函数中调用Dispose(尽管我还没有尝试过-
我想Timer可能是在回调期间锁定)。

编辑:不,我想您不能这样做,因为您必须在

Timer
构造函数本身中指定回调参数。

也许是这样的吗?(再次,实际上没有尝试过)

class TimerState{    public Timer Timer;}

…并启动计时器:

TimerState state = new TimerState();lock (state){    state.Timer = new Timer((callbackState) => {        action();        lock (callbackState) { callbackState.Timer.Dispose(); }        }, state, millisecond, -1);}

锁定应防止计时器回调

Timer
在设置字段之前尝试释放计时器。


附录:如注释者所指出的,如果

action()
对UI进行操作,则使用a
System.Windows.Forms.Timer
可能是更好的选择,因为它将在UI线程上运行回调。然而,如果不是这种情况下,它的到
Thread.Sleep
主场迎战
Threading.Timer
Threading.Timer
是要走的路。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/568530.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号