在下面的方法中,使用
之间的区别是什么 ListThreads.Add(new Task(() => item.Execute()));
和
ListThreads.Add(new Task(item.Execute));
private void Execute()
{
for (int i = 0; i < ThreadNumber; i++)
{
ListObjects.Add(new MyClass(i + 1, ThreadNumber));
}
foreach (MyClass item in ListObjects)
{
ListThreads.Add(new Task(() => item.Execute()));
ListThreads[ListThreads.Count - 1].Start();
}
Task.WaitAll(ListThreads.ToArray());
}
答案 0 :(得分:3)
你问的是
之间的区别() => item.Execute()
和
item.Execute
前者是一个叫item.Execute
的lambda。 item.Execute
是一个方法组。当它们传递给Task
的构造函数时,它们都被转换为Action
类型的委托。
但是有很大的不同。 lambda捕获变量item
。方法组没有。这意味着当执行lambda时,变量item
的值可能与将lambda传递给Task
的构造函数时的值不同。
要使lambda版本等效于方法组版本,您可以引入一个局部变量:
foreach (MyClass item in ListObjects)
{
MyClass tmpItem = item;
ListThreads.Add(new Task(() => tmpItem.Execute()));
ListThreads[ListThreads.Count - 1].Start();
}
请注意,语言已在C#4.0和C#5.0之间进行了修改。在C#5.0中,您的问题中的代码与本答案中上面的代码完全相同。有关详细信息,请参阅:
答案 1 :(得分:-2)
首先,在lambda表达式中使用foreach变量是个坏主意。因此,在这种特殊情况下,正确的方法是编写ListThreads.Add(new Task(item.Execute));