任务<t>保留起始参数

时间:2017-02-16 08:35:04

标签: c# multithreading

创建任务时,是否可以记录用于启动任务的参数。

以下面的例子为例(只是一个原型,它不是真的!)。

    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 个答案:

答案 0 :(得分:3)

除了使用这两个值返回Tuple之外,您还可以将taskList设为ICollection<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)

如果您可以更改myFunc更改返回类型,那么它会将输入和结果作为Tuple返回。

如果您无法使用DictionaryList<Tuple<input,Task>>将输入与任务(而不是ICollection)一起存储