当控制流到该锁外的lambda函数时,是否会持久锁定?

时间:2012-11-06 09:26:23

标签: c# .net lambda locking

假设我有以下代码:

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是否会被释放或保留?

2 个答案:

答案 0 :(得分:3)

lock将继续举行。

此处没有“锁定之外”的代码;重要的不是代码编写的地方或它的外观(即使lambda函数在最终类方法中,也没有区别),但只能从调用的地方开始。因为你在拿着锁的同时打电话,所以没有什么可说的了。

答案 1 :(得分:2)

是的,它会。

这将会发生,因为标准控制流将在actuallyDoStuff方法解析中被阻止,直到该exetucion结束。你作为参数传递的那个委托只是纯粹的MSIL代码,它被注入(或者不是,我真的不知道,但是就像这样)进入该方法并在lock范围内成功运行。

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