2016-06-20 9 views
1

ich kein Experte in C# bin und ganz neu in TPL ...Generisches Aufruf für StartNew und ContinueWhenAll

Ich habe viele andere Aufgabe, die ich beginnen soll und einige abhängig von anderen. Außerdem möchte ich aus einer XML-Konfigurationsdatei entscheiden, ob ein Teil des Tasks ausgeführt werden muss oder nicht, und dann die Tasks, die von einem Task abhängig sind, der nicht ausgeführt wird, dürfen nicht warten, bis dieser Task ausgeführt wird.

Mit if-Anweisungen für all dies meinen Code overcomplicates so würde ich so etwas tun:

static Task<bool> StartTask(List<Task<bool>> dependencies, 
          Func<bool> action) 
{ 
    List<Task<bool>> filtered = new List<Task<bool>>(); 
    foreach (Task<bool> t in dependencies) 
    { 
     if (t != null) 
     { 
      filtered.Add(t); 
     } 
    } 

    Task<bool> task; 
    if (filtered.Count == 0) 
    { 
     task = (Task<bool>)tf.StartNew(action); 
    } 
    else 
    { 
     task = (Task<bool>)tf.ContinueWhenAll(filtered.ToArray(), ts => action); 
    } 

    return task; 
} 

Also die Idee ist, ich die Liste der Abhängigkeiten von jeder Aufgabe zu Beginn erzeugen und dann, wenn Jede Aufgabe wird nicht gefiltert, indem die Liste der Null-Aufgaben gefiltert wird ... und wenn keiner der Vorfahren der Aufgabe ausgeführt wurde, rufe ich StartNew statt ContinueWhenAll ... auf diese Weise setze ich Listen mit den Abhängigkeiten und rufe alle Aufgaben auf auf generische Weise.

Aber ich weiß nicht, ob das machbar ist und wie man es in C# macht. Irgendeine Idee??

Alle Aufgaben kehren bool zurück, haben jedoch andere Parameter.

Javier

+0

Wie verpacken Sie Ihre Aufgaben in eine neue Klasse und erstellen Sie eine [Verantwortungskette] (https://sourcemaking.com/design_patterns/chain_of_responsibility). Auf diese Weise können Sie entscheiden, welche Aufgabe nacheinander ausgeführt wird. – ckruczek

+0

Mehr als eine Kette wäre dies ein Baum oder eine Grafik. Und einige Aufgaben können parallel ausgeführt werden und einige nicht ... Ich sehe nicht, wie man dieses Muster in diesem Fall implementiert. –

Antwort

1

ich es so schreiben würde:

await Task.WhenAll(dependencies.Where(t => t != null)); 
await Task.Run(() => action()); 

ich das Where(t => t != null) Teil ein Argument Validierung machen würde und machen es illegal null Aufgaben zu übergeben.

+1

Vielen Dank! Genau das, was ich brauchte ... etwas Einfaches (ist nur ein Build-Tool) und das funktioniert. –