【发布时间】:2014-03-21 05:18:28
【问题描述】:
我在这个页面上学习 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 上进行了搜索,没有发现任何有用的详细信息,但这是:“一个包含要由操作委托使用的数据的对象。” MSDN 真的什么都解释不了。
谁能解释一下?
【问题讨论】:
标签: c# .net multithreading task-parallel-library task