.NET CF WinCE 上的 EventArgs 线程安全吗
Are EventArgs thread safe on .NET CF WinCE
我正在尝试维护一些可怕的 VB 以获得并发性。
我想将一些数学代码委托给一个线程,并让它使用 EventArgs 引发一个事件,该事件包含一个结构,其中包含用于更新表单的信息。在 UI 事件处理程序中,我使用 BeginInvoke 以免阻塞线程,因为 UI 更新需要相当多的时间,但线程需要继续进行下一组数学运算.
之前的程序员实现了一个计时器来调用数学代码,并且有一大群代表结果的全局变量;我无法实现数据锁定,变化太大了。计时器解决方案的问题是数学代码不能 运行 而 UI 正在更新(以较慢的速度)。我还考虑过将 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
您在 post 中获得了很多信息,并且可能暗示了其他一些问题。但具体来说,只要引发事件的 class 在每个通知上创建一个新的 EventArgs 就可以了,不需要在事件侦听器中复制 EventArgs。
我正在尝试维护一些可怕的 VB 以获得并发性。
我想将一些数学代码委托给一个线程,并让它使用 EventArgs 引发一个事件,该事件包含一个结构,其中包含用于更新表单的信息。在 UI 事件处理程序中,我使用 BeginInvoke 以免阻塞线程,因为 UI 更新需要相当多的时间,但线程需要继续进行下一组数学运算.
之前的程序员实现了一个计时器来调用数学代码,并且有一大群代表结果的全局变量;我无法实现数据锁定,变化太大了。计时器解决方案的问题是数学代码不能 运行 而 UI 正在更新(以较慢的速度)。我还考虑过将 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
您在 post 中获得了很多信息,并且可能暗示了其他一些问题。但具体来说,只要引发事件的 class 在每个通知上创建一个新的 EventArgs 就可以了,不需要在事件侦听器中复制 EventArgs。