调用多线程应用程序的方法?
Invoke method for multi thread application?
我的应用程序中有一个与 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
正确的、线程安全的调用实际上并不像人们想象的那么难(甚至对于线程安全事件也不是,但这与这个问题无关)。
我建议你使用正常的 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))
我的应用程序中有一个与 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
正确的、线程安全的调用实际上并不像人们想象的那么难(甚至对于线程安全事件也不是,但这与这个问题无关)。
我建议你使用正常的 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))