2017-02-16 6 views
2

Beim Erstellen einer Aufgabe können die Parameter aufgezeichnet werden, die zum Starten der Aufgabe verwendet wurden.Aufgabe <T> Beibehalten der Startparameter

Betrachten Sie als Beispiel (nur ein Prototyp, es ist nicht real!).

static void Main(string[] args) 
    { 
     ICollection<Task<int>> taskList = new List<Task<int>>(); 

     // Create a set of tasks 
     for (int i = 1; i <= 10; i++) 
     { 
      var local_i = i; // Local scoped variable 
      Task<int> t = new Task<int>(() => 
      { 
       return myFunc(local_i); 
      }); 
      t.Start(); 
      taskList.Add(t); 
     } 

     // Wait for all the tasks to complete. 
     Task.WaitAll(taskList.ToArray()); 


     // Output the results 
     foreach (var tsk in taskList) 
     { 
      // the "???" should be the input value to the task 
      System.Diagnostics.Debug.WriteLine("Input: ??? - Result: "+tsk.Result); 
     } 

    } 

    static int myFunc(int i) 
    { 
     return (i * i); 
    } 

Wenn die Ergebnisse ausgegeben werden, möchte ich wissen, was Eingangsgröße myFunc() zur Verfügung gestellt wurde, die das Ergebnis erzeugte

+2

Nein es ist nicht möglich. Sie können jedoch ein Objekt zurückgeben, das sie enthält. In Ihrem Beispiel ein KeyValuePair oder ein benutzerdefiniertes Objekt. –

+0

Nicht auf Ihre Fragen bezogen, aber aus irgendeinem Grund, warum Sie eher kalte als heiße Aufgaben erstellen möchten? – stt106

Antwort

3

Neben Zurückgeben eines Tuple mit beiden Werten verwenden, könnte man auch taskList machen eine ICollection<Tuple<int, Task<int>>> und Speichern Sie den Parameter dort. Um es einfacher, können Sie Ihre eigene Klasse für das erstellen:

class TaskInfo<T> 
{ 
    public Task<T> Task { get; set; } 
    public T Parameter { get; set; } 
} 

Und dann

var taskList = new List<TaskInfo<int>>(); 
... 
taskList.Add(new TaskInfo { Task = t, Parameter = local_i }); 
+1

Ich würde diesen Ansatz verwenden, da es nicht die von der Task aufgerufene Methode ändert und die zusätzlichen Daten auf der logischen Ebene hält, zu der sie gehört. –

+0

Schön ... Das wird den Trick machen .. danke –

0

Wenn Sie myFunc Änderung des Rückgabetyp ändern kann, so wird es die Eingabe und Ergebnis zurück als Tuple.

Wenn Sie nicht, dass Sie ein Dictionary oder List<Tuple<input,Task>> zum Speichern der Eingabe zusammen mit der Aufgabe (statt Ihrer ICollection)

Verwandte Themen