我在VB.NET中编写的使用AddHandler / RemoveHandler令牌的代码有问题。
这是我编写的代码:
Private Sub Remove_Handler()
RemoveHandler txtSearch.TextChanged, AddressOf Ricarica_elenco
RemoveHandler cbAttori.SelectedIndexChanged, AddressOf Ricarica_elenco
RemoveHandler cbGeneri.SelectedIndexChanged, AddressOf Ricarica_elenco
RemoveHandler cb_plex.CheckStateChanged, AddressOf Ricarica_elenco
End Sub
Private Sub Add_Handler()
AddHandler txtSearch.TextChanged, AddressOf Ricarica_elenco
AddHandler cbAttori.SelectedIndexChanged, AddressOf Ricarica_elenco
AddHandler cbGeneri.SelectedIndexChanged, AddressOf Ricarica_elenco
AddHandler cb_plex.CheckStateChanged, AddressOf Ricarica_elenco
End Sub
Private Sub Ricarica_elenco(sender As Object, e As EventArgs)
CreaElenco()
End Sub
我有4个事件处理一个子例程。执行完“ Add_Handler”子程序后,如果同时发生两个或多个指示的事件,则子程序“ Ricarica_Elenco”将执行几次。
我需要创建一个自定义事件(或其他方式),该事件将收集4个原始事件并仅在两个或多个事件同时发生时才执行一次“ Ricarica_Elenco”过程。
我该怎么办?
谢谢
马塞洛(Marcello)
答案 0 :(得分:1)
事件不会同时发生。可能是在 CreaElenco 方法中,您执行的操作触发了另一个对 CreaElenco 的调用,例如修改了 txtSearch 的文本或修改了的当前索引> cbAttori
这足以触发对关联事件处理程序的调用,并在您仍在处理对 CreaElenco 的第一次调用时,级联调用 CreaElenco 。一个简单的解决方案是在输入 CreaElenco 方法之前删除处理程序,并在完成后读取它们。当然,您应该确保始终读取 CreaElenco 方法内发生的所有处理程序。可以在删除处理程序的代码周围添加Try / Finally子句来实现。
for mod in dynamods
dynamods[mod].execute()
答案 1 :(得分:0)
一种解决方法是创建一个 static 布尔变量,该变量指示该方法是否正在运行:
Private Sub Ricarica_elenco(sender As Object, e As EventArgs)
Static currentlyRunning As Boolean
If currentlyRunning Then Exit Sub
currentlyRunning = True
CreaElenco()
currentlyRunning = False
End Sub
如果愿意,还可以将静态变量替换为类级变量。