在我的C#程序中,我试图让Panel每秒调用一次OnPaint()来基于当前设置进行一些图形绘制。主要形式使用System.Timers.Timer来调用Panel类的update方法,该方法以Refresh()调用结尾。但是,当我运行它时,我总是得到一个InvalidOperationExcetpion,它引用Refresh行,并说“跨线程操作无效:Control”是从创建它的线程之外的其他线程访问的。它还使我指向此MSDN页面:http://msdn.microsoft.com/en-us/library/ms171728.aspx
但是该页面上的所有示例似乎都建议将新线程绑定到特定的表单事件。我是根据计时器而不是鼠标单击或类似事件进行更新。在单独的线程上运行刷新对我来说听起来不错,但是我不确定该怎么做(我对Java很好,但是对C#新手却很满意)。
最佳答案
主窗体使用System.Timers.Timer来调用Panel类的update方法
两种选择:
在面板上设置Timer.SynchronizationObject
,它将触发UI线程中的刻度
首先使用System.Windows.Forms.Timer
,即使在UI线程中也总是会增加刻度线
基本上,您不应该从其他线程访问UI元素-您可以通过Control.Invoke
或Control.BeginInvoke
编组到正确的线程,但是如果除了更新UI之外没有其他重要工作要做,您可以以及只需强制计时器在UI线程中引发事件即可。