Как удалить упакованный / нестандартный обработчик событий, добавленный из экземпляра класса VB.NET
Мне нужно создать несколько экземпляров 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 ответ
Это то, что вы сейчас делаете, когда хотите удалить событие:
Public Sub RemoveBioHandler(iDevice As String, CZKEM As zkemkeeper.CZKEM)
MyNewWrapperClass = New MyWrapperClass(iDevice, CZKEM)
RemoveHandler MyNewWrapperClass.AttEventWrapper, AddressOf LogRaised
End Sub
Вы создаете новый объект ZkemEventClass (который связывает обработчик с его событием, потому что вы его так определили в конструкторе), а затем вы вызываете 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