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确实没有解释什么。
有人能解释一下吗?
这是一个更简洁的示例,可能有助于解释它。
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中的值
| 归档时间: |
|
| 查看次数: |
4499 次 |
| 最近记录: |