1

私が持っている場合:

lock(myLockObject)
{
    mySharedBuffer.Modfiy();
    something.BeginDoStuff(new Action(delegate()
        {
            mySharedBuffer.Modify();
        }));
}

また、BeginDoStuff() に提供されたコールバックは別のスレッドでコールバックされます - コールバックが最終的に実行されるときにロックが保持/再取得されますか? (ロックが失われたと推測し、再度ロックする必要がありますが、そのように記載されたドキュメントが見つかりません)

4

2 に答える 2

2

コールバックが最終的に実行されるときにロックが保持/再取得されますか?

いいえ - 魔法は起こっていません!

BeginXXXすぐに戻り、制御がブロックから抜け出しlock、ロックが解除されます。

コールバックで再度ロックを取得したい場合は、別のlockブロックが必要になります。

すべてのロックと同様に、これはmySharedBuffer、ロックが解除されたときにオブジェクトを一貫した状態にしておく必要があることを意味します。BeginXXXまた、このオブジェクトは、ロックを解除してからコールバックが再びロックを取得するまでの間に、別のスレッドによって変更される可能性があります。


の実装がBeginXXXコールバックを同期的に実行できる場合、コールスタックは通常のシーケンシャル コードのようになり、ロックは引き続き保持されます。この場合、コールバックで再度ロックを取得しようとするとMonitor、同じスレッドで再帰的なロック取得が許可されるため、すぐに取得されます。

于 2013-01-09T12:38:29.300 に答える
0

lockいいえ。匿名デリゲートはリージョンのパーではありません。

通常、BeginXXX メソッドは非同期操作を実行し、すぐに戻ります。対応する EndXXX メソッドもあり、操作の完了を待ちます。

匿名デリゲートをロックする場合は、ネストされたロックを使用する必要があります。

lock(myLockObject)
{
    mySharedBuffer.Modfiy();
    something.BeginDoStuff(new Action(delegate()
        {
            lock (myLockObject) // nested locking here
            {
               mySharedBuffer.Modify();
            }
       }));
}
于 2013-01-09T12:39:59.847 に答える