О методе Task.StartNew (Action <Object>, Object)

Я изучаю TPL на этой странице, и один блок кода меня сильно смущает.

Я читал эту страницу:Параллелизм задач (библиотека параллельных задач)

в одном разделе говорилось, что следующий код - правильное решение, потому что лямбда в цикле не может получить значение, поскольку оно мутирует после каждой итерации, но конечное значение. Поэтому вы должны заключить «i» в объект CustomData. Код ниже:

class CustomData
{
   public long CreationTime;
   public int Name; 
   public int ThreadNum;
}

public class Example
{
   public static void Main()
   {
      // Create the task object by using an Action(Of Object) to pass in custom data 
      // to the Task constructor. This is useful when you need to capture outer variables 
      // from within a loop. 
      Task[] taskArray = new Task[10];
      for (int i = 0; i < taskArray.Length; i++)
      {
         taskArray[i] = Task.Factory.StartNew( (Object obj ) =>
            {
               CustomData data = obj as CustomData;
               if (data == null) 
                  return;

               data.ThreadNum = Thread.CurrentThread.ManagedThreadId;
               Console.WriteLine("Task #{0} created at {1} on thread #{2}.", data.Name, data.CreationTime, data.ThreadNum);
            },
            new CustomData()
            {
               Name = i,
               CreationTime = DateTime.Now.Ticks
            });
      }
      Task.WaitAll(taskArray);     
   }
}

Код довольно прост и понятен, но тут возникает моя проблема:

в методе Task.Factory.StartNew () автор использует одну из его форм перегрузки:

Task.StartNew(Action<Object>, Object)

Мне так любопытно узнатьоткуда берется «объект»? Как у него есть 3 свойства: Имя, CreationTime и ThreadNum.

Я искал по MSDN не нашел полезных деталей, но это: «Объект, содержащий данные, которые будут использоваться делегатом действия».MSDN Это действительно ничего не объясняет.

Кто-нибудь может это объяснить?

Ответы на вопрос(2)

Ваш ответ на вопрос