调用多线程应用程序的方法?

时间:2016-03-02 19:44:34

标签: vb.net multithreading invoke begininvoke measurement-studio

我的应用程序中有一个与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

1 个答案:

答案 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))