2011-09-11 34 views
4

假設我們有一個lambda表達式像LAMBDA內LAMBDA

 var thread= new Thread(() => 
     { 
      Foo1(); 
      Foo2(() => 
      { 
       Foo3(); 
       DoSomething(); 
      } 
      ); 
     }); 

的問題是,當DoSomething()評估?在thread創建或致電thread.Start()

回答

8

DoSomething()可能從來沒有被調用。只有在Foo2()執行給定的委託時纔會被調用。所以執行的順序是:

  1. 代表被創建並傳遞給Thread構造函數。委託中的代碼都沒有執行。
  2. 大概有人打電話thread.Start()
  3. Foo1()執行
  4. 委託創建(或者可能從緩存字段檢索)表示對Foo3()DoSomething()的呼叫,但這些呼叫還沒有執行
  5. 委託引用傳遞給Foo2()
  6. 如果Foo2()執行委託,然後Foo3()DoSomething()將被執行
+0

當然,Foo2()也可以將委託賦值給一個變量,並且很久以後(甚至可能在另一個線程,甚至原始線程上)的另一個函數可能最終執行它,可能會多次。它是 – cdiggins

0

委託庫侖d被稱爲從不或多次。 Foo2()可以對代理做任何事情,包括將其分配給某個變量或完全忽略它。

我們只知道如果運行它,它必須在線程啓動後的某個點發生,並且Foo1()已經執行而沒有拋出未捕獲的異常。