.NET CF WinCE上的EventArgs线程安全吗?

时间:2018-12-15 11:33:47

标签: multithreading compact-framework eventargs

我正在尝试维护一些可怕的VB来实现并发。

我想将一些Math代码委托给一个线程,并使其与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

1 个答案:

答案 0 :(得分:1)

该帖子中提供了很多信息,并可能暗示了其他一些问题。但具体来说,只要引发事件的类在每个通知上创建一个新的EventArgs,那么您就可以了,不需要在事件侦听器中复制EventArgs。