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
我怎樣才能解決這個問題?
它會作爲一個班嗎?我認爲這是同一個問題。 – Stefano
@Stefano:好吧,不清楚你在用ScaleElement做什麼來表明線程應該停止,但是如果代碼是我想象的那樣,那麼使用類應該可行,是的。新線程將引用「控制器」線程仍具有的同一對象,因此從另一側對該對象的更改將被另一側看到。 (你需要小心同步以確保所做的更改根據內存模型是可見的,但這是一個不同的問題。) –
我會解釋更好的編輯帖子,同時我會嘗試將結構更改爲類。 – Stefano