1

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

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

4

1 回答 1

2

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

于 2019-12-14T00:32:41.507 回答