[英]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.