对于列表byref中的每个元素

时间:2012-12-12 16:53:34

标签: vb.net multithreading visual-studio-2010

我有一个必须作为参数传递给线程的结构列表;列表中的每个元素都有一个。线程将循环,直到结构中的布尔值变为真。

所以我做了:

        For Each ScaleElement In Scales
            Dim NewThread As New System.Threading.Thread(Sub() ScaleThread(ScaleElement))
            NewThread.Start()
        Next

通过byref传递ScaleElement。但是,我有一个警告:“在lambda表达式中使用迭代变量可能会产生意想不到的结果”。并且警告它是正确的,因为它似乎在同一元素上运行线程。

如果我尝试:

        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

将scale变量(在配置文件读取时)设置为读取比例的类。

Scales是“Public Sc​​ales As New List(Of ScaleStruct)”所以,当我想停止线程时,我想在结构中使用boolean(Abort)。

然后,线程是一个循环:

Private Sub ScaleThread(ByRef Tscale As ScaleStruct)
        Do Until Tscale.Abort
            ...
        Loop
End Sub

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

你的意思是ScaleElement有一个布尔属性来决定是否继续?如果是这样,听起来最简单的方法是使它成为一个类而不是一个结构。 (说实话听起来就像在课堂上更合适一样,说实话。)