Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#winform两个定时器访问同一个变量_C#_Winforms_Timer_System.timers.timer - Fatal编程技术网

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

C#winform两个定时器访问同一个变量,c#,winforms,timer,system.timers.timer,C#,Winforms,Timer,System.timers.timer,我是C#新手,我正在做一个项目,需要两个计时器来同时访问同一个变量(一个用来读取,另一个用来写入或更新)。因此,我的问题是我应该使用哪个计时器?Forms.Timer或Thread.Timer。我读过一些关于他们之间差异的文章。因为我想使用这些计时器来更新程序的界面(图片框中的图像),所以我认为应该在这里使用Forms.Timer,因为它与GUI相关。然而,哪个定时器首先执行的顺序也是重要的,所以我认为Thread.timer也应该被考虑。有没有办法把它们结合起来 更新:我正在做一个心电图项目,

我是C#新手,我正在做一个项目,需要两个计时器来同时访问同一个变量(一个用来读取,另一个用来写入或更新)。因此,我的问题是我应该使用哪个计时器?Forms.Timer或Thread.Timer。我读过一些关于他们之间差异的文章。因为我想使用这些计时器来更新程序的界面(图片框中的图像),所以我认为应该在这里使用Forms.Timer,因为它与GUI相关。然而,哪个定时器首先执行的顺序也是重要的,所以我认为Thread.timer也应该被考虑。有没有办法把它们结合起来


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

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

你说的“哪个计时器首先执行的顺序也很重要”是什么意思?你希望两个计时器同时启动,并且需要按照特定的顺序处理事件吗?你应该坚持使用WinForms特定的计时器。你不必通过锁来控制对变量的访问。你的程序到底在做什么?听起来可能有更好的模式。@Rufus L,你好,我刚刚编辑了我的问题,除了@Jimi所说的之外,你能给我一些建议或更好的解决方案吗。使其顺利运行的诀窍是在绘制处理程序中绘制,然后仔细管理无效区域。在传入数据到达时对其进行处理,然后仅使需要更新的区域无效。一段时间后,您的绘画程序将被调用。只有无效区域将被更新,所以,我应该使用thread.Timer来更新数据缓冲区,因为它需要更多的计算,而form.Timer来重新绘制表单,对吗?还有一个问题是,它们是否在同一个线程上运行?对。关于运行线程,正如我所写的:
Form.Timer.Tick
事件处理程序将在GUI线程上工作,而
thread.Timer.TimerCallback
主要在不同于GUI的线程上工作。