C# 当控制流到锁之外的lambda函数时,锁是否会被持久化?
假设我有以下代码:C# 当控制流到锁之外的lambda函数时,锁是否会被持久化?,c#,.net,lambda,locking,C#,.net,Lambda,Locking,假设我有以下代码: void DoStuff( SomeClass withObject ) { Action helper = () => { withObject.RunHelper(); } lock( withObject ) { actuallyDoStuff( helper ); } } void actuallyDoStuff( Action action ) { action(); } 您可以
void DoStuff( SomeClass withObject )
{
Action helper = () =>
{
withObject.RunHelper();
}
lock( withObject ) {
actuallyDoStuff( helper );
}
}
void actuallyDoStuff( Action action )
{
action();
}
您可以看到,动作助手
代码在锁
之外。我希望Action
只是一个未命名的函数,因此调用它将无法在lock
之外获得控制,并且lock
将持续存在
但我不确定
当控件位于动作帮助器内时,锁是否会被释放或保持?是的,它会
这将发生,因为标准控制流将在actuallyDoStuff
方法执行中被阻塞,直到该执行结束。作为参数传递的委托没有什么,而只是纯MSIL代码,它被注入(或者不是,我不知道,但行为类似)到该方法中,并在lock
范围内成功运行
因此,锁将持续存在,因为没有“外部”。锁将继续保持
这里没有“锁外”的代码;重要的不是代码的编写位置或外观(即使lambda函数在最终类方法中,也绝对没有区别),而是调用代码的位置。既然你拿着锁打电话,那就没什么好说的了