Vb.net 带闭包的递归回调安全吗?

Vb.net 带闭包的递归回调安全吗?,vb.net,closures,Vb.net,Closures,我想知道我是否做过这样的事情: Private CurrentASyncSerialNumber As Integer ' Break the callback chain if it isn't totally dean Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If tmrNoSerialAc

我想知道我是否做过这样的事情:

   Private CurrentASyncSerialNumber As Integer  ' Break the callback chain if it isn't totally dean
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
          If tmrNoSerialActivity.ElapsedTime > 2 Then
             CurrentASyncSerialNumber += 1
             RunASyncComms(0, CurrentASyncSerialNumber)
          End If
       End Sub



Private Sub RunASyncComms(State As Integer, SerialNumber As Integer)
   if SerialNumber<>CurrentASyncSerialNumber then return
   tmrNoSerialActivity.ResetTimer 
   select case State 
       case 0    

         ' Some aync code involving RS232
          RS232_AddCommand(Sub() RunASyncComms(1000, SerialNumber))
      case 1000:
         ' Some aync code involving RS232
          RS232_AddCommand(Sub() RunASyncComms(2000, SerialNumber))
      case 2000:
         ' Some aync code involving RS232,
          RS232_AddCommand(Sub() RunASyncComms(0, SerialNumber))
          ' And now we start over.
Private CurrentASyncSerialNumber As Integer'如果回调链不完全正确,请断开回调链
私有子Timer1_Tick(ByVal发送方作为System.Object,ByVal e作为System.EventArgs)处理Timer1.Tick
如果tmrNoSerialActivity.ElapsedTime>2,则
CurrentASyncSerialNumber+=1
RunASyncComms(0,CurrentASyncSerialNumber)
如果结束
端接头
专用子RunASyncComms(状态为整数,SerialNumber为整数)
如果是SerialNumberUrrentaSyncSerialNumber,则返回
tmrNoSerialActivity.ResetTimer
选择案例状态
案例0
'一些涉及RS232的aync代码
RS232_AddCommand(Sub()RunASyncComms(1000,SerialNumber))
案例1000:
'一些涉及RS232的aync代码
RS232_AddCommand(Sub()RunASyncComms(2000,SerialNumber))
案例2000:
'一些涉及RS232的aync代码,
RS232_AddCommand(Sub()RunASyncComms(0,SerialNumber))
“现在我们重新开始。
函数RS232_AddCommand与BeginInvoke类似,只是它在所有计时器和绘制事件完成之前不会触发下一个命令,并且还确保前一个RS232异步代码已完成

我的问题是这一行递归地调用它“RS232_AddCommand(Sub()RunASyncComms(1000,SerialNumber))”。这是否会创建一个不断累积且永远不会被垃圾收集收集的闭合链?因为它被添加到集合中,并且在运行时被延迟,所以我这样做安全吗?或者我会因为最终的堆栈溢出而变得更糟


我想知道我的代码是否安全。

我应该提到RS232_AddCommand添加到列表中,并且我在运行时有一个计时器,如果RS232未标记为忙,则从列表中删除该项。如果它被标记为忙,那么当RS232数据进入并接收到最后一个字节时,在运行回调来处理接收到的数据后,我关闭RS232Busy,以便计时器可以运行下一个调用。这意味着对“RunASyncComms”的递归调用总是由system.windows.forms.timer触发并被延迟。观察任务管理器,内存增长非常快,但当我放入执行“GC.Collect”的按钮时,任何活动都需要很长时间才能发生。看起来这会留下很多垃圾,但垃圾收集最终会得到它。看起来GC.Collect并没有像任务管理器报告的那样减少内存使用,只是需要很长时间才能开始使用内存。它的内存使用量也永远不会超过10mg。