2011-09-11 32 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()已经执行而没有抛出未捕获的异常。