关于 Task.StartNew(Action<Object>, Object) 方法

Alb*_*Gao 3 .net c# multithreading task task-parallel-library

我正在这一页上学习 TPL,有一个代码块让我很困惑。

我正在阅读此页:任务并行性(任务并行库)

在一节中,它说以下代码是正确的解决方案,因为循环中的 lambda 无法获取每次迭代后都会发生变化的值,而是获取最终值。因此,您应该将“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);     
   }
}
Run Code Online (Sandbox Code Playgroud)

代码相当简单且易于理解,但我的问题来了:

在Task.Factory.StartNew()方法中,作者使用了其重载形式之一:

Task.StartNew(Action<Object>, Object)
Run Code Online (Sandbox Code Playgroud)

我很好奇“obj”从哪里来?它如何具有 3 个属性:Name、CreationTime 和 ThreadNum。

我搜索了 MSDN,没有发现任何有用的细节,但这个:“包含操作委托使用的数据的对象。” MSDN确实没有解释什么。

有人能解释一下吗?

Jar*_*Par 5

这是一个更简洁的示例,可能有助于解释它。

void StartNew(Action<object> action, object o) {
  action(o);
}
Run Code Online (Sandbox Code Playgroud)

StartNew方法仅接受委托并通过作为参数action传递来调用它。传递给 lambda 的值只是在 lambda 之后o传递的值StartNew

// Prints "hello world"
StartNew(o => Console.WriteLine(o), "hello world");
Run Code Online (Sandbox Code Playgroud)

在您概述作为第二个参数传递的值的情况下

new CustomData() {Name = i, CreationTime = DateTime.Now.Ticks} 
Run Code Online (Sandbox Code Playgroud)

这只是创建一个类型为 的新对象CustomData,为其分配一些属性,并使其成为紧接在其之前定义的 lambda 的参数。obj最终会成为lambda中的值