0

我在我的應用程序中有一個錯誤,它與here相同,這個人遇到了同樣的問題。我的應用程序是多線程的,工作線程正在UI上更新Waveformgraph。我相信這是我的問題所在,爲什麼,週期性地和偶然性地在運行應用程序時,至少在我的一個波形圖對象中獲得了一個大紅色的X.從閱讀和研究,我需要使用Invoke或BeginInvoke方法?有人可以更好地解釋並提供與我的代碼相關的示例代碼嗎?到目前爲止,我發現的樣品仍然讓我朦朧我需要做什麼或需要做什麼。感謝您的幫助。多線程應用程序的調用方法?

此代碼位於主線程swScopeOnOff單擊事件中。

thread2 = New System.Threading.Thread(AddressOf dataAcquiring) 
    thread2.Start() 

此代碼是dataAcquiring子

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 

回答

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)) 
+0

我的目標是.NET 4.0,所以簡化了。非常感謝你的代碼和「如何」以及每一個的解釋。 – busarider29

+0

@ busarider29:不客氣。 .NET 4.0是我認爲最好的更新之一。 <3 –