【发布时间】:2019-04-29 06:08:01
【问题描述】:
我需要创建多个 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 无法回答,是否有其他[工作]选项可供我满足我的要求?
我现在在这里被困了一个星期,我在谷歌上找不到任何与我的问题类似的东西。
请任何人帮助我:(
【问题讨论】:
-
您好,尼克,您在
Sub RemoveBioHandler中注释掉的代码是正确的。但是,当您在主程序中调用DisconnectFromDevice时,您正在创建 ZKEMEventClass 的新实例并删除该对象的处理程序。这是没有意义的,因为无论如何该对象只存在于子中。您要做的是传递您现有对象之一的引用,并在该对象上调用RemoveBioHandler。 -
@AConfusedSimpleton:我认为创建新实例时不会删除处理程序,因为我使用的两个测试设备都处于活动状态并且正在引发事件。只是我不能一个一个地取消它们,也不能同时全部取消。
-
@AConfusedSimpleton:我已经更新了上面的代码。我使用字典 (如您之前建议的) 来包含并传递我创建的每个 CZKEM 对象。但遗憾的是,我仍然无法删除处理程序。我又一无所知:(你还有其他选择吗?
-
嗨尼克,我想你误解了我的评论的意思,或者我误解了你想要实现的目标。我正在写一个更深入的例子
-
@AConfusedSimpleton:是的,请举个例子,我知道你是唯一可以帮助我解决这个问题的人。非常感谢
标签: vb.net multiple-instances eventhandler biometrics zkemkeeper