簡體   English   中英

兩種調用方法的方法有何區別?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM