while(true)和时钟timer有什么不同?

代码铺到天琴座 2025-08-08 15:57:16

要刷新PLC里的数据,被人告之用while(true),这是个死循环,会一遍又一遍地将程序从头到尾执行。

后来发现timer时钟,也可以每隔一段时间就循环执行它里面的程序,这样的话它也可以刷新PLC里的数据。

那么二者有什么不同?

...全文
995 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

所以呢,即使是
while(ture){
task.run(()=>{
// 你需要做的事情
})
await task.delay(1000)
}

效果其实和timer是一样的,因为这代码是个异步的。当然如果你这样写代码,需要注意的事情是“就是中间那个你需要做的事情,请保证他在1000内能做完”,不然你就等着去找那个博客园的一线码农去了。他最喜欢这样的了,这意味着他又可以水一篇“我有一个朋友”的已经水了5,6年的系列惊悚水文了

  • 打赏
  • 举报
回复

这个咋说呢,你的游戏,你的所有的桌面程序都有一个 while(true),这个叫消息循环体。你都提plc了,如果你去写plc代码,你会发现plc代码也就是一个while(true)
那么和你自己写while(true)区别在哪里呢? 区别在同步代码还是异步代码。
桌面程序 while(true) 消息循环,是用异步api接收系统消息泵里的消息,没消息他在逻辑上“堵住” 循环,实际上这个循环已经被释放了,他不占cpu
你自己写的,如果你写的是异步代码,那么这个while(true)将永远不释放,永远在使用cpu

至于timer把,有两种UI里的timer实际用的就是消息泵,他不占cpu,只是到时间了给UI发个消息,UI的那个while(ture)消息体收到后,在根据消息call 对应的方法。

by_封爱 版主 08-12
  • 打赏
  • 举报
回复 1

实现的功能 其实都一样.. 比如 间隔3秒 从PLC读取数据 显示到winform上.

但是实现本质上 稍微有点区别.

如果你不使用线程 那么while+sleep 的时候会线程阻塞, 也就是UI看到的"卡死" 当然你肯定会新启动一个线程. 这样就无所谓了.

而timer不会阻塞线程,间隔达到后会触发事件 回调在线程池中执行.(效率比较高)

就算你while+线程 那么while会独占当前线程 不会被释放.

所以还是timer比较好

MichaelGLX 08-11
  • 打赏
  • 举报
回复

区别在于 自己做饭和点外卖

rrokoko 08-09
  • 打赏
  • 举报
回复

真用起来其实也没什么不同,while也可以设置间隔

111,115

社区成员

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

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

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