Chris Hammond
Chris Hammond

Reputation: 2186

Task <T> retaining starting parameters

When creating a Task, is it possible to record the parameters that were used to start the task.

Take to following as an example (just a prototype, it's not 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);
    }

When the results are output, I want to know what input variable was provided to myFunc() that produced the result

Upvotes: 2

Views: 65

Answers (2)

Sylence
Sylence

Reputation: 3073

If you can change myFunc change the return type, so it will return the input and result as a Tuple.

If you can't you could use a Dictionary or List<Tuple<input,Task>> to store the input along with the task (instead of your ICollection)

Upvotes: 0

vgru
vgru

Reputation: 51244

Besides returning a Tuple with both values, you can also make taskList an ICollection<Tuple<int, Task<int>>> and store the parameter there. To make it simpler, you might create your own class for that:

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

And then

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

Upvotes: 3

Related Questions