lock
文は以下にC#3.0で翻訳されています:
var temp = obj;
Monitor.Enter(temp);
try
{
// body
}
finally
{
Monitor.Exit(temp);
}
C#4.0ではこれが変更され、次のように生成されます。
bool lockWasTaken = false;
var temp = obj;
try
{
Monitor.Enter(temp, ref lockWasTaken);
// body
}
finally
{
if (lockWasTaken)
{
Monitor.Exit(temp);
}
}
ここで何Monitor.Enter
が行われるかについての詳細情報を見つけることができます。MSDNを引用するには:
Enter
パラメータとして渡されたオブジェクトのモニターを取得するために使用します。別のスレッドがEnter
オブジェクトに対してを実行したが、対応するをまだ実行していないExit
場合、現在のスレッドは、他のスレッドがオブジェクトを解放するまでブロックします。同じスレッドがEnter
ブロックせずに複数回呼び出すことは正当です
。ただし、Exit
オブジェクトを待機している他のスレッドのブロックが解除される前に、同数の
呼び出しを呼び出す必要があります。
Monitor.Enter
方法は無限に待機します。それはなりませんタイムアウト。