Вызвать метод для многопоточного приложения?
У меня есть ошибка в моем приложении, такая же, как здесь, где этот человек сталкивался с той же проблемой. Мое приложение является многопоточным, где рабочий поток обновляет график формы волны в пользовательском интерфейсе. Я полагаю, что именно в этом моя проблема, и поэтому периодически, а иногда и при запуске приложения, я получаю большой красный крестик по крайней мере в одном из моих объектов waveformgraph. Из чтения и исследования мне нужно использовать метод Invoke или BeginInvoke? Может кто-нибудь объяснить лучше и предоставить пример кода, который имеет отношение к моему коду? Образцы, которые я нашел до сих пор, все еще неясно, как мне нужно это делать или что мне нужно делать. Спасибо за помощь.
Этот код находится в событии щелчка swScopeOnOff, основной поток.
thread2 = New System.Threading.Thread(AddressOf dataAcquiring)
thread2.Start()
Этот код находится в dataAquying 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 ответ
Правильный, поточно-ориентированный вызов на самом деле не так сложен, как можно подумать (даже для поточно-ориентированных событий, но это не имеет значения для этого вопроса).
Я бы порекомендовал вам использовать обычный 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))