0

私はこのようなことをするかどうか知りたいです:

   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.

関数 RS232_AddCommand は、BeginInvoke と似ていますが、すべてのタイマーとペイント イベントが完了するまで次のコマンドを起動せず、以前の RS232 非同期コードが完了していることを確認する点が異なります。

私の質問は、「RS232_AddCommand(Sub() RunASyncComms(1000, SerialNumber))」を再帰的に呼び出すこの行です。それは、ガベージ コレクションによって収集されずに蓄積されるクロージャ チェーンを作成しますか? コレクションに追加され、実行が遅れるので、これを行うのは安全ですか? それとも、最終的なスタック オーバーフローでさらに悪化するのでしょうか。

私のコードが安全かどうか知りたいです。

4

0 に答える 0