[英]What is the difference between the two ways to invoke the method?
在下面的方法中,使用之间有什么区别
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());
}
你问之间的区别
() => 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中,您问题中的代码的行为与此答案中以上代码的行为完全相同。 有关更多详细信息,请参见:
首先,在lambda表达式中使用foreach变量是一个坏主意。 因此,在这种情况下,正确的方法是编写ListThreads.Add(new Task(item.Execute));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.