2012-12-12 37 views
0

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

所以,我提出:

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

随着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 

的尺度变量被设置(上的配置文件读出)的一类读取刻度。

Scales是一个“公开比例作为新列表(ScaleStruct)”,所以,当我想停止线程时,我想在结构中使用一个布尔值(Abort)。

然后,线程是一个循环:

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

我怎样才能解决这个问题?

回答

0

你的意思是ScaleElement有一个布尔属性来决定是否继续?如果是这样,这听起来像最简单的方法将是使其成为一个类,而不是一个结构。 (它听起来喜欢它将是一个更好的适合作为一个类,无论如何,老实说。)

+0

它会作为一个班吗?我认为这是同一个问题。 – Stefano

+0

@Stefano:好吧,不清楚你在用ScaleElement做什么来表明线程应该停止,但是如果代码是我想象的那样,那么使用类应该可行,是的。新线程将引用“控制器”线程仍具有的同一对象,因此从另一侧对该对象的更改将被另一侧看到。 (你需要小心同步以确保所做的更改根据内存模型是可见的,但这是一个不同的问题。) –

+0

我会解释更好的编辑帖子,同时我会尝试将结构更改为类。 – Stefano

相关问题