Multithreading EventArgs在.NET CF WinCE上是线程安全的吗

Multithreading EventArgs在.NET CF WinCE上是线程安全的吗,multithreading,compact-framework,eventargs,Multithreading,Compact Framework,Eventargs,我试图维护一些可怕的VB来获得并发性 我想将一些数学代码委托给一个线程,让它用EventArgs引发一个事件,该事件包含一个结构,其中包含更新表单所需的信息。在UI事件处理程序中,我使用BeginInvoke以避免阻塞线程,因为UI更新需要花费相当多的时间,但线程需要进行下一组数学运算 先前的程序员实现了一个定时器来调用数学代码,并且有一个代表结果的全局变量的小昆虫群;我无法实现数据锁定,这是一个太大的变化。计时器解决方案的问题是,当用户界面更新速度较慢时,数学代码无法运行。我还考虑过在许多计时

我试图维护一些可怕的VB来获得并发性

我想将一些数学代码委托给一个线程,让它用EventArgs引发一个事件,该事件包含一个结构,其中包含更新表单所需的信息。在UI事件处理程序中,我使用BeginInvoke以避免阻塞线程,因为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

你在那篇文章中得到了很多信息,可能还隐含了一些其他问题。但具体来说,,只要引发事件的类在每个通知上创建一个新的EventArgs,您就可以了,不需要在事件侦听器中复制EventArgs。

我发现一件与问题无关的事情是,我需要在开始Invoke之前删除事件处理程序,以免溢出堆栈;即在引发事件的线程中删除事件处理程序。但是,是的,EventArg是使用New而不是静态方式创建的。这是一个很大的编辑,因为有很多控件需要更新,但是现在得到了一个更流畅的用户界面,并且数学运行得像时钟一样快。我认为这是因为在事件回调中调用Application.DoEvents。我不需要。同意,我也删除了这个。也删除了更新和刷新,因为它们会导致闪烁。代码是一个真正的烂摊子,部分功能是在UI中实现的,同时也是在线程中运行的数学代码中实现的。我正在逐渐把它弄干净。