C# 关于System.Windows.Forms.Timer的问题

C# 关于System.Windows.Forms.Timer的问题,c#,.net,winforms,timer,C#,.net,Winforms,Timer,我正在构建一个WinForms应用程序,从套接字读取数据并绘制线条。 我正在使用System.Windows.Forms.Timer每秒触发 从套接字填充的队列中获取数据 重新绘制图表上的线条 我的问题是关于Timer对象的:每个WinForm都有一个Timer对象,它有一个要重画的图表;假设我有20个图表,我将有20个表单,总共有20个计时器 这是一个好方法吗?我是基于以下原因决定的(如果我错了,请纠正我) Forms.Timer实例不会在我的应用程序上创建线程,而是在从表单的消息泵接收

我正在构建一个WinForms应用程序,从套接字读取数据并绘制线条。 我正在使用
System.Windows.Forms.Timer
每秒触发

  • 从套接字填充的队列中获取数据
  • 重新绘制图表上的线条
我的问题是关于Timer对象的:每个WinForm都有一个Timer对象,它有一个要重画的图表;假设我有20个图表,我将有20个表单,总共有20个计时器

这是一个好方法吗?我是基于以下原因决定的(如果我错了,请纠正我)

  • Forms.Timer
    实例不会在我的应用程序上创建线程,而是在从表单的消息泵接收WM_定时器事件时触发事件
  • 它位于GUI的同一线程中,因此我可以直接访问表单的每个元素,而不用担心太多
太多的定时器是一个好方法还是我会有缺点? 谢谢
AFG

这是一个很好的方法,尽管您可能希望重用计时器,而不是为每个表单创建单独的计时器。

例如,您可以创建一个
静态
计时器对象,并在表单构造函数中添加一个
勾选
处理程序。请记住在表单关闭时取消订阅事件(在
Dispose
OnClose
),否则您的表单将永远不会消亡。

这是一个很好的方法,尽管您可能希望重用计时器,而不是为每个表单创建单独的计时器。

例如,您可以创建一个
静态
计时器对象,并在表单构造函数中添加一个
勾选
处理程序。记住在表单关闭时取消订阅事件(在
Dispose
OnClose
),或者您的表单永远不会消亡。

更好的方法是使用工作线程接收数据,并使用从该工作线程触发的事件通知UI重新绘制自身。

更好的方法是使用工作线程接收数据,并使用从该工作线程触发的事件通知UI重新绘制自身。

为什么不重新绘制当套接字接收到数据时,请立即重新绘制该行?

当套接字接收到数据时,为什么不立即重新绘制该行?

我相信他已经在这样做了。(
来自由套接字填充的队列)嗨,本尼!谢谢你!是的,这是正确的。套接字在单独线程的while循环中读取。读取被阻塞,因此数据可用时读取。读取数据后,我将其放入每个表单包含的同步队列中。然后每秒钟,每个表单的计时器都会把它排出来,重新绘制一张图表。我相信他已经在这样做了。(
来自由套接字填充的队列)嗨,本尼!谢谢你!是的,这是正确的。套接字在单独线程的while循环中读取。读取被阻塞,因此数据可用时读取。读取数据后,我将其放入每个表单包含的同步队列中。然后每秒钟,每个表单的Form.Timer都会将其出列,以重新绘制一个图表。我没有这样做的原因是,由于我从套接字接收到的数据非常大,应用程序可能会花费所有时间重新绘制图表线。如果我有很多图表,我预计会有一些缓慢或最糟糕的情况,我的应用程序的CPU只在1个while循环中急剧增长。我没有这样做的原因是,由于我从套接字接收到的数据非常大,应用程序可能会花费所有时间重新绘制图表线。如果我有很多图表,我预计会有一些缓慢或最糟糕的情况,我的应用程序的CPU只在一个while循环中急剧增长。嗨,松弛!我希望你还在身边!由于每个Forms.Timer用于处理来自同一队列的WM_Timer事件(您能否确认这一点),我认为您是对的。我没有这样做是因为两个原因:-最终效果(我必须尝试)我希望它更好,因为使用一个计时器的30个图表中的1个重绘被分成30个较小的重绘-由于重画例程位于计时器内,因此唯一计时器必须知道有关30个表单的信息。我决定了一个设计选择,那就是“它的表单有自己的计时器来重新绘制它自己”。请告诉我你的想法,你误解了我。每个表单都可以向单个计时器实例添加自己的
Tick
处理程序。代码将完全相同,但是使用更少的计时器可能会减少开销。谢谢!我将尝试这种方法,看看结果如何。嗨,SLaks!我希望你还在身边!由于每个Forms.Timer用于处理来自同一队列的WM_Timer事件(您能否确认这一点),我认为您是对的。我没有这样做是因为两个原因:-最终效果(我必须尝试)我希望它更好,因为使用一个计时器的30个图表中的1个重绘被分成30个较小的重绘-由于重画例程位于计时器内,因此唯一计时器必须知道有关30个表单的信息。我决定了一个设计选择,那就是“它的表单有自己的计时器来重新绘制它自己”。请告诉我你的想法,你误解了我。每个表单都可以向单个计时器实例添加自己的
Tick
处理程序。代码将完全相同,但是使用更少的计时器可能会减少开销。谢谢!我将尝试这种方法,看看结果如何。