[英]Are EventArgs thread safe on .NET CF WinCE
我正在嘗試維護一些可怕的VB並發。
我想將一些Maths代碼委托給一個線程,並讓它引發一個帶有EventArgs的事件,該事件包含一個具有用於更新表單的信息的結構。 在UI事件處理程序中,我使用BeginInvoke以避免阻塞線程,因為UI更新會花費很多時間,但是線程需要繼續進行下一組數學運算。
以前的程序員實現了一個計時器來調用Maths代碼,並且有大量代表結果的全局變量。 我無法實現數據鎖定,這是一個很大的變化。 計時器解決方案的問題在於,在更新UI(速度較慢)時,無法運行Maths代碼。 我還考慮過將UI代碼拆分為多個計時器事件,但是要在整個周期之間保持平衡也很難實現。
EventArgs線程是否安全,即如果UI開始使用傳遞的EventArgs並且該線程生成了另一個事件,或者UI應該在控制權轉移到UI線程之前克隆一個副本?
我寫了一些看起來像這樣的測試代碼。
Private Observed As UIDelegatePattern.Observed
Private Delegate Sub ProcessDelegate(ByVal sender As Object, ByVal e As UIDelegatePattern.Observed.ProcessEventArgs)
Private Sub Render(ByVal sender As Object, ByVal e As UIDelegatePattern.Observed.ProcessEventArgs)
If Me.InvokeRequired Then
Dim d As ProcessDelegate = New ProcessDelegate(AddressOf Render)
' invoke on the UI thread asynchronously
Me.BeginInvoke(d, New Object() {sender, e})
Else
' prevent event overflow by removing the handler before the long rendering activity
RemoveHandler Observed.EventHandler, AddressOf Render
' simulate many controls updates
For i As Integer = 0 To 1000
Me.Label1.Text = e.Message
Next
Me.Update()
Me.Refresh()
Application.DoEvents()
' add the handler back in for next time
AddHandler Observed.EventHandler, AddressOf Render
End If
End Sub
您在那篇文章中獲得了很多信息,並且可能暗示了其他一些問題。 但具體來說,只要引發事件的類在每個通知上創建一個新的EventArgs,那么您就可以了,不需要在事件偵聽器中復制EventArgs。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.