2016-07-12 9 views
0

Ich muss einen Webservice mehrere Male aufrufen, da es eine Grenze von 100 Objekten pro Aufruf zurückgegeben hat, und ich möchte dies parallel tun.Ich erwarte mehrere Aufgaben in einer Schleife

Ich mache eine Aufgabe für jeden Web-Service-Aufruf und ich stoppe, wenn eine Aufgabe weniger als die Grenze der Elemente zurückgibt, was bedeutet, dass es keine weiteren Elemente zu erhalten gibt.

public static async Task<List<Space>> GetSpacesByTypeParallel(SpaceType type, string ticket, int degreeOfParallelism) 
{ 
    int offset = 0; 
    int batchSize = degreeOfParallelism * RETURN_LIMIT; 
    List<Space> spaces = new List<Space>(); 
    Task<List<Space>>[] tasks = new Task<List<Space>>[degreeOfParallelism]; 
    bool shouldContinue = true; 
    while(shouldContinue) 
    { 
     for(int i = 0; i < degreeOfParallelism; i++) 
     { 
      tasks[i] = Task.Run<List<Space>>(() => GetSpacesAtOffset(offset + (i * RETURN_LIMIT), RETURN_LIMIT, ticket, null, type.ToString())); //GetSpacesAtOffset is a synchronous method 
     } 

     List<Space>[] result = await Task.WhenAll(tasks); 

     foreach(List<Space> item in result) 
     { 
      spaces.AddRange(item); 
      if(item.Count < RETURN_LIMIT) 
      { 
       shouldContinue = false; 
      } 
     } 

     offset += batchSize; 
    } 
    return spaces; 
} 

Ich bin mit diesem synchron zu Testzwecken:

var spaces = Space.GetSpacesByType(SpaceType.Type1, ticket).Result; 

aber dies immer eine leere Liste zurück, aber wenn ich mit dem Debugger Schritt durch tut, was es soll.

Was mache ich falsch?

Antwort

2

Ich glaube, dass es durch die Schließung Variable verursacht wird. Versuchen Sie, es zu ändern

for(int i = 0; i < degreeOfParallelism; i++) 
    { 
     var n = i; 
     tasks[i] = Task.Run<List<Space>>(() => GetSpacesAtOffset(offset + (n * RETURN_LIMIT), RETURN_LIMIT, ticket, null, type.ToString())); //GetSpacesAtOffset is a synchronous method 
    } 
+0

Ja, das war es. Vielen Dank! – Adrian