2012-12-12 31 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

相關問題