4

假设我有以下代码:

void DoStuff( SomeClass withObject )
{
    Action helper = () =>
    {
        withObject.RunHelper();
    }
    lock( withObject ) {
       actuallyDoStuff( helper );
    }
}

void actuallyDoStuff( Action action )
{
    action();
}

你看,Action helper代码在lock. 我希望这Action只是一个未命名的函数,因此调用它不会获得外部控制,lock并且lock会持续存在。

不过我不确定。

lock控制在内部时会被释放还是持续存在Action helper

4

2 回答 2

3

lock继续举行。

这里没有“锁外”的代码;重要的不是代码是在哪里编写的或者它看起来像什么(即使 lambda 函数在最终类方法中,也绝对没有区别),而只是从它被调用的地方。由于您在持有锁的同时调用它,因此没有什么可说的了。

于 2012-11-06T09:34:42.627 回答
2

是的,它会的。

这会发生,因为标准控制流将在actuallyDoStuff方法执行上被阻塞,直到该执行结束。您作为参数传递的那个委托什么都不是,只是纯 MSIL 代码被注入(或没有,我真的不知道,但行为类似)到该方法中并在lock范围内成​​功运行。

因此,锁将持续存在,因为没有“外部”。

于 2012-11-06T09:29:19.443 回答