.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。