2017-02-16 6 views
2

タスクを作成するときに、タスクの開始に使用されたパラメータを記録することができます。タスク<T>開始パラメータを保持

次の例を参考にしてください(実際のプロトタイプではありません)。

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); 
    } 

結果が出力されると、私は入力変数は、それが入力して結果を返しますので、あなたは、戻り値の型myFunc変更を変更することができれば、結果

+2

:それは簡単にするために、あなたはそのための独自のクラスを作成していないかもしれません。しかし、それらを含むオブジェクトを返すことができます。あなたの例では、KeyValuePair またはカスタムオブジェクトです。 –

+0

あなたの質問には関係ありませんが、ホットなものではなくコールドタスクを作成する理由は何ですか? – stt106

答えて

3

と一緒に入力を保存するためにDictionaryまたはList<Tuple<input,Task>>を使用することができますすることができない場合は、あなたもtaskListICollection<Tuple<int, Task<int>>>を作ることができますし、そこにパラメータを格納します。いいえ、それは不可能です

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

そして

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

このアプローチは、タスクによって呼び出されたメソッドを変更することを伴わず、余分なデータをそれが属する論理レベルに保持するので、私はこのアプローチを使用します。 –

+0

ニース...それはトリックを行うだろう..ありがとう –

0

を生成myFunc()に提供されたかを知りたいですTupleとなります。

あなたは両方の値でTupleを返すほかに(代わりにICollectionの)タスク

関連する問題