スレッドへの引数として渡さなければならない構造のリストがあります。リスト内の要素ごとに1つ。構造内のブール値がtrueになるまで、スレッドはループします。
だから私は作った:
For Each ScaleElement In Scales
Dim NewThread As New System.Threading.Thread(Sub() ScaleThread(ScaleElement))
NewThread.Start()
Next
ScaleElementが参照によって渡されます。しかし、警告があります。「ラムダ式で反復変数を使用すると、予期しない結果が生じる可能性があります」。そして、同じ要素でスレッドを実行しているように見えるので、それは正しいという警告です。
私が試してみると:
For Each ScaleElement In Scales
Dim NewScale = ScaleElement
Dim NewThread As New System.Threading.Thread(Sub() ScaleThread(NewScale))
NewThread.Start()
Next
正常に動作しますが、「NewScale」は別の要素であるため、リスト内の要素のループを解除するための条件を設定しようとすると、もちろん動作しません。
ScaleStruct:
Public Structure ScaleStruct
Dim Key As String
Public Scale
Dim Database As String
Dim Table As String
Dim Field As String
Dim Keyname As String
Dim Interval As Integer
Dim Insert As Boolean
Dim Format As String
Public Abort As Boolean
Dim FailCount As Integer
End Structure
スケール変数は、(構成ファイルの読み取り時に)スケールを読み取るクラスに設定されます。
Scalesは「(ScaleStructの)新しいリストとしてのパブリックスケール」なので、スレッドを停止したい場合は、構造体でブール値(Abort)を使用したいと思います。
次に、スレッドはループです。
Private Sub ScaleThread(ByRef Tscale As ScaleStruct)
Do Until Tscale.Abort
...
Loop
End Sub
どうすればこれを解決できますか?