关于 Task.StartNew(Action, Object) 方法
2024-02-16

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

我正在读这个页面:任务并行性(任务并行库) http://msdn.microsoft.com/en-us/library/dd537609%28v=vs.110%29.aspx

在一节中,它说以下代码是正确的解决方案,因为循环中的 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);     
   }
}

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

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

Task.StartNew(Action<Object>, Object)

我很好奇想知道“obj”从哪里来?它如何具有3个属性:名称、创建时间和线程号。

我搜索了 MSDN,没有发现任何有用的细节,但这个:“包含操作委托使用的数据的对象。”MSDN http://msdn.microsoft.com/en-us/library/dd321456%28v=vs.110%29.aspx这确实不能解释任何事情。

有人能解释一下吗?


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

void StartNew(Action<object> action, object o) {
  action(o);
}

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

// Prints "hello world"
StartNew(o => Console.WriteLine(o), "hello world");

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

new CustomData() {Name = i, CreationTime = DateTime.Now.Ticks} 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 Task.StartNew(Action, Object) 方法 的相关文章

随机推荐