首页 > 解决方案 > 在构造函数 VB.NET 中的运行时添加处理程序

问题描述

重新编辑

根据@enigmativity 在他的评论中的建议,我重新编辑了这个问题,使其更容易理解。

这是我想在我的程序中做的一个例子。我试图让它尽可能简单,所以我希望你能理解我的问题。

问题如下:我正在尝试动态添加处理程序,因为我有一个对象需要在发生某些事情时触发处理程序,并且我可以在程序中动态创建这些对象。也许按照这个例子你可以理解我的问题。

如果我有一个对象,例如一辆汽车,它有自己的属性(门、轮子、马达……),并且在路上发生了一些事情,我希望处理程序 BREAK 触发,并在 BREAK 函数中做我需要做的任何事情让它打破。这是该对象的类的示例代码:

Public Class Car

Public Property carName As String
Public Property wheels As Integer
Public Property motor As String
Public Property color As String
Public Property speed As Decimal
Private Event BreakCar()

Public Sub New()

End Sub

Public Sub New(ByVal name_ As String, ByVal wheels_ As Integer, motor As String, color As String, ByVal speed As Decimal)
    carName = name_
    wheels = wheels_
    motor = motor_
    color = color_
    speed = speed_
End Sub

Public Sub Break()
    Try
        AddHandler BreakCar, AddressOf EmergencyBreak
        RaiseEvent AutoMsg()
    Catch ex As Exception
        MsgBox("Error: " & ex.Message & ". Stacktrace: " & ex.StackTrace)
    End Try
End Sub

Private Sub EmergencyBreak()
    Try

        MsgBox("Emergency Break")
    Catch ex As Exception
        MsgBox("Error: " & ex.Message & ". Stacktrace: " & ex.StackTrace)
    End Try
End Sub

End Class

另外,在主要形式中,我有这样的东西:

Public Class frmMain
...

Private Sub AddMe(ByVal name_ As String, ByVal wheels_ As Integer, ByVal motor_ As String, ByVal color_ As String, ByVal speed_ As Decimal, Byval initCoordinates_ as PointLatLng)

    Try

        unitsList.Add(New Car(name_, wheels_, motor_, color_, speed_))

        Dim marker As GMapMarker
        marker = New GMarkerGoogle(initCoordinates_, GMarkerGoogleType.orange_dot)
        marker.ToolTipMode = MarkerTooltipMode.Always
        marker.ToolTipText = name_
        meOverlay.Markers.Add(marker)

        Dim lvItem As ListViewItem
        lvItem = lvUnits.Items.Add(name_)
        lvItem.SubItems.Add(Math.Round(initCoordinates_.Lat, 4))
        lvItem.SubItems.Add(Math.Round(initCoordinates_.Lng, 4))

        Dim unit_ As Car = unitsList.FirstOrDefault(Function(x) x.carName = name_)
        unit_.Break()

        Dim tTemp_ As Thread = New Thread(Sub() CarMovement(unit_))
        tTemp_.Name = name_
        tTemp_.Priority = ThreadPriority.Normal
        tTemp_.Start()
        unitsThreadList.Add(tTemp_)

    Catch ex As Exception
        MsgBox("Error: " & ex.Message & ". Stacktrace: " & ex.StackTrace)
    End Try

End Sub
...
End Class

有了这个,我试图在系统中添加汽车,使用不同的线程,在将汽车添加到系统后,启动它的处理程序以使其在某些情况发生时中断。

我的问题是处理程序从不触发,我不知道原因,因为当汽车 X 发生某些事情时,处理程序 Break() 必须触发但它没有触发。

难道我做错了什么?也许不可能为每个像这样动态创建的对象添加处理程序?

谢谢你的帮助!

标签: vb.netvisual-studio

解决方案


推荐阅读