在我的 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/