假设我有以下代码:
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
是否会被释放或保留?
答案 0 :(得分:3)
lock
将继续举行。
此处没有“锁定之外”的代码;重要的不是代码编写的地方或它的外观(即使lambda函数在最终类方法中,也没有区别),但只能从调用的地方开始。因为你在拿着锁的同时打电话,所以没有什么可说的了。
答案 1 :(得分:2)
是的,它会。
这将会发生,因为标准控制流将在actuallyDoStuff
方法解析中被阻止,直到该exetucion结束。你作为参数传递的那个委托只是纯粹的MSIL代码,它被注入(或者不是,我真的不知道,但是就像这样)进入该方法并在lock
范围内成功运行。
因此,锁定将持续存在,因为没有“外部”。