允许另一个类中的计时器更新C#gui(表单)

允许另一个类中的计时器更新C#gui(表单),c#,events,user-interface,C#,Events,User Interface,我正在尝试制作一个程序,每30秒用新数据更新GUI。我现在有它,所以你可以点击一个按钮来更新数据值,但我希望成品自动更新。我确信这是一个简单的添加,也许添加了backgroundWorker类?或者让某个东西生成一个事件,该事件的处理方式与buttonClicked操作侦听器的工作方式相同。进行此操作的最佳方法是什么?您可以使用计时器: 我会在表单中添加一个计时器,让它调用与按钮事件相同的代码。由于计时器位于另一个线程上,因此会出现线程问题。确保调用调用并签出./p>< p>你必须考虑从真实数据

我正在尝试制作一个程序,每30秒用新数据更新GUI。我现在有它,所以你可以点击一个按钮来更新数据值,但我希望成品自动更新。我确信这是一个简单的添加,也许添加了backgroundWorker类?或者让某个东西生成一个事件,该事件的处理方式与buttonClicked操作侦听器的工作方式相同。进行此操作的最佳方法是什么?

您可以使用计时器:


我会在表单中添加一个计时器,让它调用与按钮事件相同的代码。由于计时器位于另一个线程上,因此会出现线程问题。确保调用调用并签出./p>< p>你必须考虑从真实数据源获取数据需要多长时间。这是因为如果使用Winform计时器,在计时器事件处理期间,UI将不会响应其他用户事件,因此如果这是一个较长的过程,用户体验将变差。使用后台工作线程是一个不错的策略,但在这种情况下,您必须通过Control.Invoke或使用
preogreschanged
事件更新UI。在我看来,第二个选项(BackgroundWorker)更好。

如果这是一个Windows窗体应用程序,那么实现这一点最简单的方法就是使用计时器组件。当计时器“滴答”时,您可以指定执行间隔甚至处理程序

如果要从计时器事件处理程序更新GUI,可能需要使用Application.DoEvents使窗口“重新绘制”。否则,在处理所有事件之前,您可能看不到GUI中的任何更改。请看这里:


上面提供的解决方案是最简单的方法。当您熟悉这个概念时,您可能希望扩展关于线程的知识,并从没有创建GUI的线程更新GUI,等等。这对您来说可能很有趣:

我会在表单创建期间抓取一个,并将其保存为私有字段。然后在计时器事件中,使用所述Field的方法在UI线程的上下文中调用UI更新代码

此方法适用于Winforms和WPF


您不需要使用system.Forms.Timer,您可以使用它将代码块的执行移动到UI线程的上下文中,无论是从system.Timer、ThreadPool还是其他线程。这篇文章解释得更详细一些。

是的,我只需要无限期地更新它。我知道while(true)应该做这项工作,但我认为这被认为是糟糕的编码实践?计时器将继续运行,并在您设置的时间间隔内触发。直到你停止。这就是我最终选择的。一旦我有了更多的空闲时间,我就会对线程变得更加熟悉。谢谢