О методе 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 Это действительно ничего не объясняет.
Кто-нибудь может это объяснить?