我的应用程序中有一个与here相同的错误,这个人遇到了同样的问题。我的应用程序是多线程的,其中工作线程正在更新UI上的Waveformgraph。我相信这就是我的问题所在,以及为什么,定期,以及在运行应用程序时,我在至少一个波形图对象中得到一个大的红色X.从阅读和研究,我需要使用Invoke或BeginInvoke方法?有人可以更好地解释并提供与我的代码相关的示例代码吗?到目前为止,我发现的样本仍然让我模糊了我需要做什么或我需要做什么。谢谢你的帮助。
此代码位于swScopeOnOff点击事件,即主线程。
thread2 = New System.Threading.Thread(AddressOf dataAcquiring)
thread2.Start()
此代码位于dataAcquiring Sub
中 Public Sub dataAcquiring()
'While Scope switch is on, stream each Ai channel's data continuously to its respective WaveForm graph
Do While swScopeOnOff.Value = True
data = reader.ReadWaveform(readRate)
i = 0
For Each WaveformGraph In WFGS
WaveformGraph.PlotWaveformAppend(data(i)) 'This line is updating the UI's waveform graphs
i += 1
Next
i = 0
Loop
End Sub
答案 0 :(得分:2)
正确的,线程安全的调用实际上并不像人们想象的那么难(甚至对于线程安全事件也没有,但这与此问题无关)。
我建议您使用普通Invoke
方法,例如Me.Invoke()
(其中Me
是当前表单,如果不是,请使用Form1
或其他任何名称代替)。使用BeginInvoke()
可能是异步的,但它会堆叠内存使用情况,如果未正确调用EndInvoke()
,则可能导致内存泄漏。
如果你的目标是.NET 4.0或更高版本,你可以这样做:
Me.Invoke(Sub() WaveformGraph.PlotWaveformAppend(data(i)))
但是,如果您的目标是.NET 3.5或更低版本,则需要更多行代码。
'Outside your Sub.
Delegate Sub WaveformAppendDelegate(ByRef WaveformGraph, ByRef data)
'Create a new sub.
Public Sub AppendData(ByRef WaveformGraph, ByRef data)
WaveformGraph.PlotWaveformAppend(data)
End Sub
'Inside your sub, when you're going to invoke.
Me.Invoke(New WaveformAppendDelegate(AddressOf AppendData), WaveformGraph, data(i))