1

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

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

4

1 回答 1

8

主窗体使用 System.Timers.Timer 调用 Panel 类的更新方法

两种选择:

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

于 2012-07-27T14:30:27.877 回答