4

次のコードがあるとします。

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

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

ご覧のとおり、Action helperコードはの外にありlockます。これは名前のない関数であると思いますので、それを呼び出すと、のAction外部で制御を取得できず、持続します。locklock

しかし、私にはわかりません。

lockコントロールが内部にある間、は解放または持続されますAction helperか?

4

2 に答える 2

3

lock引き続き開催されます。

ここには「ロックの外」のコードはありません。重要なのは、コードがどこに書かれているか、どのように見えるかではなく(ラムダ関数もエンドクラスのメソッドにあり、まったく違いはありません)、呼び出された場所からのみです。あなたはロックを保持しながらそれを呼んでいるので、それについて言うことは何もありません。

于 2012-11-06T09:34:42.627 に答える
2

はい、そうなります。

actuallyDoStuffメソッドの実行では、その実行が終了するまで標準の制御フローがブロックされるため、これは問題になります。パラメータとして渡すデリゲートは、そのメソッドに挿入され(または、実際にはわかりませんが、そのように動作する)純粋なMSILコードであり、lockスコープ内で正常に実行されます。

したがって、「外部」がないため、ロックは持続します。

于 2012-11-06T09:29:19.443 に答える