Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当控制流到锁之外的lambda函数时,锁是否会被持久化?_C#_.net_Lambda_Locking - Fatal编程技术网

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函数在最终类方法中,也绝对没有区别),而是调用代码的位置。既然你拿着锁打电话,那就没什么好说的了