2017-11-29 4 views
0

System.Threading.Tasks에 문제가 있는데 왜 작동하지 않는지 이해할 수 없습니다.각각에 대한 작업 [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()) 

나는 항상

Key = SEC03 
Key = SEC03 
Key = SEC03 

당신 잘못이 무엇인지 말해 줄 수이 결과를 얻을?

+0

잘 모르겠지만 작업 sub의'pair.Key'는 작업이 실행될 때 목록의 마지막 쌍에 대한 참조 일 수 있습니다. 각각의 루프에 대해'pair.Key'를 프린트 할 때 그것은 세 개의 값을 모두 보여야합니다. – xander

+0

예, '작업'외부에 3 개의 값을 표시합니다 – Mkn

+2

[this] (https://stackoverflow.com/questions/451779/how-to-tell-a-lambda-function-to-capture-a) -copy-reference-of-a-c)가 도움이 될 수 있습니다. 하위 변수에서 외부 변수를 캡처하기 때문에 약간 혼란 스러울 수 있습니다. : D – xander

답변

0

나는 몇 년 동안 VB.Net을 사용하지 않은 나는 그것을 테스트 할 수 없습니다,하지만 당신은 캡처 된 참조의 로컬 복사본을 시도하고 내 제안 link의 간단한 예제를 따라 사용할 수 있습니다 :

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()) 
관련 문제