0

У меня есть ошибка в моем приложении, которая совпадает с here, с которой этот человек сталкивался с той же проблемой. Мое приложение многопоточно, где рабочий поток обновляет Waveformgraph в пользовательском интерфейсе. Я считаю, что это моя проблема и почему, периодически и по случаю, я получаю большой красный X по крайней мере в одном из объектов waveformgraph при запуске приложения. От чтения и исследования мне нужно использовать метод 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 

ответ

2

Proper, поточно-вызов на самом деле не так сложно, как можно было бы подумать (даже не для поточно-событий, но это не имеет значения для этого вопроса).

Я бы порекомендовал вам использовать обычный 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 –