2016-11-24 28 views
0

我寫了這個代碼:到列表添加主題與選項嚴格

Dim TL As New List(Of Thread) 
For x = 0 To 10 
    TL.Add(New Thread(AddressOf ThreadWork)) 
    TL(x).Start(x) 
Next 

它正常工作與Option Strict Off
但如果我把Option Strict On我得到錯誤(重載解析失敗)上TL.Add(New Thread(AddressOf ThreadWork))

我也試過

Dim T As New Thread(AddressOf ThreadWork) 
TL.Add(T) 

,但仍然得到錯誤。

我搜索了網頁,並且在msdn上找到了相同的語法(here),所以我不明白我錯在哪裏。

ThreadWork是:Private Sub ThreadWork(ByVal W As Integer)

我的目標是讓一些線程進入一個列表或爲Array等等這樣的任何暗示的apprecciated

+0

可以顯示TL'是如何定義'/聲明 – Plutonix

+3

嚴格來說,ThreadWork參數必須是Object,而不是Integer。考慮使用lambda表達式來保持類型安全。 –

+0

@Plutonix對不起,添加TL聲明 – genespos

回答

0

試試這個代碼:

Dim TL As New List(Of Thread) 
Dim T As New Thread(Sub(w As Object) 
         ThreadWork(CInt(w)) 
        End Sub) 
TL.Add(T) 

您的方法:

Private Sub ThreadWork(ByVal W As Integer) 

End Sub 
+5

請谷歌「捕獲循環變量是有害的」,瞭解爲什麼你的答案會讓OP陷入困境。 –

0

嘗試這種方式

Dim TL As New List(Of Thread) 
For x As Integer = 0 To 10 
    Dim thrd As New Thread(AddressOf ThreadWork) 
    TL.Add(thrd) 
    thrd.Start(x) 
Next 

' '

Private Sub ThreadWork(someInt As Object) 
    Dim i As Integer = DirectCast(someInt, Integer) 
    Debug.WriteLine(i) 
    'other code 
End Sub 
+0

你忘了傳遞參數。 –

+0

它給了我同樣的錯誤,即使沒有參數 – genespos

+0

@genespos - 更正爲添加參數,並進行測試。 – dbasnett

4

試試這個:

For x = 0 To 10 
    TL.Add(New Thread(Sub(param As Object) ThreadWork(CType(param, Integer)))) 
    TL(x).Start(x) 
Next 

它創建了一個lambda表達式用相同的簽名ParameterizedThreadStart代表(如漢斯說,參數必須是類型Object)。執行時,lambda方法將調用您的ThreadWork方法並嘗試將參數轉換爲Integer

如果你的目標.NET 3.5或更低您可以使用此方法,而不是:

For x = 0 To 10 
    TL.Add(New Thread(AddressOf ThreadWorkStub)) 
    TL(x).Start(x) 
Next 

ThreadWorkStub方法:

Private Sub ThreadWorkStub(ByVal param As Object) 
    ThreadWork(CType(param, Integer)) 
End Sub 
+1

您沒有捕獲x,所以副本不是必需的。 –

+0

@HansPassant:哦,你是對的!我的錯。 –

+1

我接受Giovanni Russo的回答,因爲他速度更快,但+1;) – genespos