c# - 如何通过定时 Windows 窗体更新实现线程安全?

标签 c#

在我的 C# 程序中,我试图让面板每秒调用一次 OnPaint() 以根据当前设置进行一些图形绘制。主窗体使用 System.Timers.Timer 调用 Panel 类的更新方法,该方法以 Refresh() 调用结束。但是当我运行它时,我总是得到一个引用 Refresh 行的 InvalidOperationExcetpion 并说“跨线程操作无效:Control '' 从创建它的线程以外的线程访问”。它还让我引用这个 MSDN 页面:http://msdn.microsoft.com/en-us/library/ms171728.aspx

但是该页面上的所有示例似乎都建议将新线程绑定(bind)到特定的表单事件。我正在根据计时器进行更新,而不是鼠标单击或类似事件。在单独的线程上运行刷新对我来说听起来不错,但我不确定我会怎么做(我很擅长 Java,但是是 C# 新手)。

最佳答案

The main form uses a System.Timers.Timer to call the Panel class' update method



两种选择:
  • 设置 Timer.SynchronizationObject 到面板,所以它会触发 UI 线程中的滴答声
  • 使用 System.Windows.Forms.Timer 首先,即使在 UI 线程
  • 中也总是会提高滴答声

    基本上,您不应该从不同的线程访问 UI 元素 - 您可以通过 Control.Invoke 编码到正确的线程。或 Control.BeginInvoke ,但如果您除了更新 UI 之外没有任何重要的工作要做,您还不如强制计时器在 UI 线程中引发事件。

    关于c# - 如何通过定时 Windows 窗体更新实现线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689866/

    相关文章:

    c# - 使用外键作为主键

    c# - Java BigInteger 到 .NET 中等效的字节数组

    c# - 如何通过 C# 中的代码更改 SSIS 包中的平面文件源文件?

    C# Selenium 3.8 + Firefox 57 作为 Windows 服务运行

    c# - 我如何有效地使用计时器

    c# - db4o 如何通过配置重命名类

    c# - 如何在 MVC .Net 中的 session 超时后重定向?

    c# - 为什么我们使用GetConstructor 找不到Int32 的默认构造函数?

    c# - 如何将 json 反序列化为属性名称开头为 "@"的 C# 对象?

    c# - POST参数仅在Unity3d中始终为null