0

スレッドへの引数として渡さなければならない構造のリストがあります。リスト内の要素ごとに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

どうすればこれを解決できますか?

4

1 に答える 1

0

ScaleElement続行するかどうかを決定するブールプロパティがあるということですか?もしそうなら、最も簡単なアプローチはそれを構造ではなくクラスにすることだろうと思われます。(正直言って、とにかくクラスとしてより適しているように思えます。)

于 2012-12-12T16:59:51.313 に答える