簡體   English   中英

.NET CF WinCE上的EventArgs線程安全嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM