Как удалить упакованный / нестандартный обработчик событий, добавленный из экземпляра класса VB.NET - PullRequest
3 голосов
/ 29 апреля 2019

Мне нужно создать несколько экземпляров zkemkeeper.CZKEM для создания активных (250+) подключений к нескольким биометрическим устройствам с событиями одновременно.Я создал класс для выполнения желаемого результата:

Public Class ZKEMEventsClass

    Public CZKEM2 As New zkemkeeper.CZKEM
    Public MyNewWrapperClass As MyWrapperClass

    Public Sub AddBioHandler(iDevice As String, iIP As String, iPort As Integer)
        If CZKEM2.Connect_Net(iIP, iPort) Then
            If CZKEM2.RegEvent(1, 65535) = True Then

                MyNewWrapperClass = New MyWrapperClass(iDevice, CZKEM2)

                AddHandler MyNewWrapperClass.AttEventWrapper, AddressOf LogRaised
                MsgBox("Handler successfully registered")
            Else
                MsgBox("Error Registering Events")
            End If
        Else
            MsgBox("Error Connecting to Device")
        End If

    End Sub


    Public Sub RemoveBioHandler(iDevice As String, CZKEM As zkemkeeper.CZKEM)
        >>> MyNewWrapperClass = New MyWrapperClass(iDevice, CZKEM)
        >>> RemoveHandler MyNewWrapperClass.AttEventWrapper, AddressOf LogRaised
    End Sub

    Public Sub LogRaised(ByVal SenderName As String, ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer, ByVal iHour As Integer, ByVal iMinute As Integer, ByVal iSecond As Integer, ByVal iWorkCode As Integer)
        MsgBox("Raised event details here... [EnrollID, Year, Month, Day]...")
    End Sub
End Class

ПРИМЕЧАНИЕ: Я создал и использовал MyWrapperClass для встраивания имени пользовательского устройства в каждое биометрическое устройство, чтобыЯ могу определить, какое устройство [как CZKEM2] вызвало какое-либо событие [как CZKEM2.OnAttTransactionEx]


Public Class MyWrapperClass
    Public Property Name
    Private WithEvents CZKEM As zkemkeeper.CZKEM
    Public Event AttEventWrapper(SenderName As String, sEnrollNumber As String, iIsInValid As Integer, iAttState As Integer, iVerifyMethod As Integer, iYear As Integer, iMonth As Integer, iDay As Integer, iHour As Integer, iMinute As Integer, iSecond As Integer, iWorkcode As Integer)

    Public Sub New(WrapperName As String, CZKEMObject As zkemkeeper.CZKEM)
        Me.Name = WrapperName
        Me.CZKEM = CZKEMObject

    End Sub

    Private Sub HandleEvent(ByVal sEnrollNumber As String, ByVal iIsInValid As Integer, ByVal iAttState As Integer, ByVal iVerifyMethod As Integer, ByVal iYear As Integer, ByVal iMonth As Integer, ByVal iDay As Integer, ByVal iHour As Integer, ByVal iMinute As Integer, ByVal iSecond As Integer, ByVal iWorkCode As Integer) Handles CZKEM.OnAttTransactionEx
        RaiseEvent AttEventWrapper(Me.Name, sEnrollNumber, iIsInValid, iAttState, iVerifyMethod, iYear, iMonth, iDay, iHour, iMinute, iSecond, iWorkCode)
    End Sub
End Class

В моей основной программе я использовал следующие коды:

Sub ConnectToDevice()
        Dim iIP As String
        Dim iDevice As String
        Dim iPort As Integer
        For x = 1 To 2
            Select Case x
                Case 1
                    iIP = "122.3.47.43"
                    iDevice = "Device 1"
                Case 2
                    iIP = "192.168.10.201"
                    iDevice = "Device 2"
            End Select


            'This is the section where I create new instance of my ZKEMEventsClass
            Dim NewConnect As New ZKEMEventsClass
            NewConnect.AddBioHandler(iDevice, iIP, iPort)

        Next
End Sub

    Sub Disconnect()
        >>> For Each CZKEMObject As KeyValuePair(Of String, zkemkeeper.CZKEM) In MyWrapperClass.ListOfDevices
            >>> Dim NewRemoveHandler As New ZKEMEventsClass
            >>> NewRemoveHandler.RemoveBioHandler(CZKEMObject.Key, CZKEMObject.Value)
        >>> Next

    End Sub

ВОПРОС # 1: Как я могу удалить каждый из моих обработчиков событий или, скорее, все, когда он был создан из другого экземпляра моего ZKEMEventsClass класса?

ВОПРОС № 2 Если вопрос № 1 не отвечает, есть ли другие [рабочие] варианты для меня, чтобы удовлетворить мои требования?

Я застрял здесь на неделю и не могу найти в Google ничего похожего на мою проблему.

Пожалуйста, помогите мне кому-нибудь: (

1 Ответ

1 голос
/ 29 апреля 2019

Это то, что вы в настоящее время делаете, когда хотите удалить событие:

Public Sub RemoveBioHandler(iDevice As String, CZKEM As zkemkeeper.CZKEM)
     MyNewWrapperClass = New MyWrapperClass(iDevice, CZKEM)
     RemoveHandler MyNewWrapperClass.AttEventWrapper, AddressOf LogRaised
End Sub

Вы создаете новый ZkemEventClass Object (который связывает обработчик с его событием, потому что выВы определили это так в конструкторе) и затем вы вызываете removeBioHandler для этого вновь созданного объекта, который успешно удаляет обработчик.Но вы никогда не использовали этот объект, этот объект не является объектом, который вы создали ранее и работали с ним.он существует только в подпрограмме, в которой вы его определили.

В вашей основной программе вам нужно держаться за ссылку на каждый объект ZKemEventClass, который у вас есть, и когда придет время избавиться от него, вы вызываете егоСвойство RemoveBioHandler.Ключевым моментом здесь является то, что вы вызываете метод для этого того же объекта .Не какой-то недавно созданный.

Что касается ведения словаря ссылок на ваши классы-оболочки, вы можете сделать что-то вроде этого:

Public Class MyManagerClass
    Public MyDevicesDictionary As New Dictionary(Of String, MyWrapperClass)

    Public Sub AddDevice(Device As MyWrapperClass)
        MyDevicesDictionary.Add(Device.Name, Device)
        AddHandler Device.AttEventWrapper, AddressOf EventHandlerName
    End Sub


    Public Sub RemoveDevice(DeviceName As String)
        Dim Device As MyWrapperClass = MyDevicesDictionary(DeviceName)
        MyDevicesDictionary.Remove(DeviceName)
        RemoveHandler Device.AttEventWrapper, AddressOf EventHandlerName
    End Sub

    Public Sub EventHandlerName(Name, sEnrollNumber, iIsInValid, iAttState, iVerifyMethod, iYear, iMonth, iDay, iHour, iMinute, iSecond, iWorkCode)
        'do whatever you want to do here
    End Sub
End Class
...