私はこのようなことをするかどうか知りたいです:
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))」を再帰的に呼び出すこの行です。それは、ガベージ コレクションによって収集されずに蓄積されるクロージャ チェーンを作成しますか? コレクションに追加され、実行が遅れるので、これを行うのは安全ですか? それとも、最終的なスタック オーバーフローでさらに悪化するのでしょうか。
私のコードが安全かどうか知りたいです。