2017-11-29 8 views
0

Ich habe ein Problem mit System.Threading.Tasks, ich verstehe nicht, warum es nicht funktioniert.Aufgabe für jeden [Vb.Net]

Dim table_sec As New Dictionary(Of String, List(Of Double)) 

table_sec.Add("SEC01", New List(Of Double)(New Double() {10.00, 5.00})) 
table_sec.Add("SEC02", New List(Of Double)(New Double() {9.00, 8.00})) 
table_sec.Add("SEC03", New List(Of Double)(New Double() {5.00, 2.00})) 

    Dim pair As KeyValuePair(Of String, List(Of Double)) 
    Dim tasks As New List(Of Task)() 

    For Each pair In table_sec 
    Dim t As Task = Task.Run(Sub() 
    Console.WriteLine("Key = " & pair.Key) 
        End Sub) 

    tasks.Add(t) 

    Next  

    Task.WaitAll(tasks.ToArray()) 

habe ich immer dieses Ergebnis

Key = SEC03 
Key = SEC03 
Key = SEC03 

Können Sie mir sagen, was falsch ist?

+0

Ich bin mir nicht sicher, aber 'pair.Key' in der Task-Unter könnte ein Verweis auf das letzte Paar in der Liste sein, wenn die Aufgabe ausgeführt wird. Wenn Sie 'pair.Key' in der Schleife für jede Schleife außerhalb der Aufgabe drucken, sollte es alle drei Werte anzeigen, denke ich? – xander

+0

ja, außerhalb der 'Task' zeigt es die 3 Werte – Mkn

+2

Ich denke [this] (https://stackoverflow.com/questions/451779/how-to-tell-a-lambda-function-to-capture-a -copy-statt-einer-referenz-in-c) könnte Ihnen helfen, da Sie eine externe Variable in Ihrem Sub-Objekt erfassen, kann es etwas verwirrend werden. : D – xander

Antwort

0

Ich habe nicht VB.Net in Jahren und ich es nicht testen können, aber Sie könnten versuchen, und das einfache Beispiel von mir vorgeschlagenen link und eine lokale Kopie des erfassten Referenz folgen:

Dim table_sec As New Dictionary(Of String, List(Of Double)) 

table_sec.Add("SEC01", New List(Of Double)(New Double() {10.00, 5.00})) 
table_sec.Add("SEC02", New List(Of Double)(New Double() {9.00, 8.00})) 
table_sec.Add("SEC03", New List(Of Double)(New Double() {5.00, 2.00})) 

Dim pair As KeyValuePair(Of String, List(Of Double)) 
Dim tasks As New List(Of Task)() 

For Each pair In table_sec 
    Dim p As KeyValuePair(Of String, List(Of Double)) 
    p = pair ' make a copy to the actual pair in this loop iteration 
    Dim t As Task = Task.Run(Sub() 
    Console.WriteLine("Key = " & p.Key) ' capture local copy p instead of pair 
       End Sub) 

    tasks.Add(t) 

Next  

Task.WaitAll(tasks.ToArray())