Podczas tworzenia zadania można nagrać parametry, które zostały użyte do rozpoczęcia zadania.

Przyjmij się jako przykład (tylko prototyp, nie jest prawdziwe!).

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

Gdy wyniki są wyników, chcę wiedzieć, co dostarczono zmienną wejściową myFunc(), co spowodowało wynik

2
Chris Hammond 16 luty 2017, 11:35

2 odpowiedzi

Najlepsza odpowiedź

Oprócz zwracania Tuple za pomocą obu wartości można również zrobić taskList an ICollection<Tuple<int, Task<int>>> i przechowuj tam parametr. Aby upbliżyć, możesz stworzyć swoją własną klasę dla tego:

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

I wtedy

var taskList = new List<TaskInfo<int>>();
...
taskList.Add(new TaskInfo { Task = t, Parameter = local_i });
3
Groo 16 luty 2017, 08:41

Jeśli możesz zmienić myFunc zmienić typ powrotu, więc zwróci wejście i wynik jako Tuple.

Jeśli nie możesz użyć Dictionary lub List<Tuple<input,Task>>, aby zapisać wejście wraz z zadaniem (zamiast swojego ICollection)

0
Sylence 16 luty 2017, 08:45