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

标签 c# .net multithreading task-parallel-library task

我正在学习此页面上的 TPL,一个代码块让我很困惑。

我正在阅读这个页面:Task Parallelism (Task Parallel Library)

在一节中,它说以下代码是正确的解决方案,因为循环中的 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 个属性:Name、CreationTime 和 ThreadNum。

我在 MSDN 上进行了搜索,没有发现任何有用的细节,但找到了这个:“一个对象包含要由操作委托(delegate)使用的数据。” MSDN 真的说明不了什么。

谁能解释一下?

最佳答案

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

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

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

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

如果您概述了作为第二个参数传递的值是

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

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

关于c# - 关于 Task.StartNew(Action<Object>, Object) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22550777/

相关文章:

c# - 从连接字符串中获取用户名和密码的正确方法?

c# - 代码在本地运行良好,但在 GoDaddy 上实时发布时出错

java - 仅当队列中有内容时才消耗 cpu 的工作线程

multithreading - 简单服务器 - 如果尝试流式传输文件,线程将保持打开状态

c# - 在 C# 中生成多个唯一字符串

c# - 在 Queryable 上获取下一个和上一个

c# - 在 for 循环语句中动态创建属性名称

java - 我是否有重新排序问题,是否由于引用转义?

c# - 隔离类仅由特定类 : best practices 实例化

c# - 您将如何通过多个键实现快速查找?