C# winform 两个定时器访问同一个变量

Posted

技术标签:

【中文标题】C# winform 两个定时器访问同一个变量【英文标题】:C# winform Two timers access same variable 【发布时间】:2020-04-07 09:59:49 【问题描述】:

我是 C# 新手,我正在做一个项目,需要两个计时器同时访问同一个变量。(一个用于读取,另一个用于写入或更新)。所以,我的问题是 我应该使用哪个定时器? Forms.Timer 或 Thread.Timer。我读过一些关于它们区别的文章。由于我想使用这些计时器来更新程序的界面(图片框中的图像),所以我认为 Forms.Timer 应该在这里使用,因为它与 GUI 的东西有关。但是,哪个计时器首先执行的顺序也很重要,所以我认为 Thread.Timer 也应该考虑。有什么办法可以将它们组合在一起吗?

更新:我正在做一个心电图项目,所以基本上我一直在接收数据,我想在表格上绘制它们。但是,由于绘制大约需要 40 毫秒,所以使用一个计时器会有延迟,但我需要实时。(例如,如果我将间隔设置为 100 毫秒,那么完成应该完成的一帧绘制需要 140 毫秒100 毫秒。这将导致每个滴答声延迟 40 毫秒。)因此,我的解决方案是在我收到数据时使用一个计时器更新数据缓冲区,并使用另一个计时器调用 Invalidate,这将重新绘制所有新数据。我应该使用 thread.timer 来更新数据并使用 form.timer 来重绘表单吗?

【问题讨论】:

你是什么意思“计时器首先执行的顺序也很重要?”您是否希望这两个计时器同时触发,并且需要按特定顺序处理事件? 您应该坚持使用 WinForms 特定的计时器。您不必通过这种方式通过锁来控制对变量的访问。 你的程序到底在做什么?听起来可能有更好的模式。 @Rufus L,您好,我刚刚编辑了我的问题,您能给我提供任何建议或更好的解决方案吗 补充@Jimi 所说的内容。让它顺利运行的诀窍是在 Paint 处理程序中进行绘图,然后仔细管理 Invalidation 区域。在传入数据到达时对其进行处理,然后仅使需要更新的区域无效。一段时间后,将调用您的 Paint 例程。只有无效的区域会被更新 【参考方案1】:

两个定时器的主要区别在于Form.TimerForm在同一个线程中工作,因此Tick事件访问或更改任何GUI组件(控件等)的状态都没有问题处理程序代码。在Thread.Timer 的情况下,不能保证TimerCallback 方法是从当前线程调用的(可以,但不是必须),因此访问GUI 组件可能有点困难且不容易(必须使用@ 987654327@,喜欢这里:Accessing a form's control from a separate thread)。另一方面,在Form.Timer.Tick 处理程序中实现的任何长期和密集处理都将在与GUI 相同的线程中执行,因此会降低GUI 效率和责任感。因此,一般规则是:对于 GUI 组件的快速、短期操作,使用Form.Timer,而对于不需要访问 GUI 组件的长期、繁重的计算,使用Thread.Timer。当然,这是一个简化的规则——最终的决定应视具体情况而定。

【讨论】:

所以,我应该使用 thread.Timer 来更新数据缓冲区,因为它需要更多的计算,并使用 form.Timer 来重新绘制表单,对吗?还有一个问题是它们是否在同一个线程上运行? 对。关于运行线程,正如我所写:Form.Timer.Tick 事件处理程序将在 GUI 线程上工作,而 Thread.Timer.TimerCallback 主要而且通常在不同于 GUI 的线程上工作。

以上是关于C# winform 两个定时器访问同一个变量的主要内容,如果未能解决你的问题,请参考以下文章

winform c# 如写一个定时开始,结束的时间代码

C#:在winform上使用定时器来改变图表,定时器需要单独的方法,图表数据不能从单独的方法中编辑

.net C# winform程序定时运行代码

C# WinForm 文本框离开焦点事件 问题???

C# winForm 定时拷贝覆盖文件小工具

C#中winform的timer控件定时弹窗后,会弹出多个同样的窗口?