111,115
社区成员




要刷新PLC里的数据,被人告之用while(true),这是个死循环,会一遍又一遍地将程序从头到尾执行。
后来发现timer时钟,也可以每隔一段时间就循环执行它里面的程序,这样的话它也可以刷新PLC里的数据。
那么二者有什么不同?
所以呢,即使是
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 对应的方法。
实现的功能 其实都一样.. 比如 间隔3秒 从PLC读取数据 显示到winform上.
但是实现本质上 稍微有点区别.
如果你不使用线程 那么while+sleep 的时候会线程阻塞, 也就是UI看到的"卡死" 当然你肯定会新启动一个线程. 这样就无所谓了.
而timer不会阻塞线程,间隔达到后会触发事件 回调在线程池中执行.(效率比较高)
就算你while+线程 那么while会独占当前线程 不会被释放.
所以还是timer比较好
区别在于 自己做饭和点外卖
真用起来其实也没什么不同,while也可以设置间隔