.Net4、Monitor.Enter(lockObject、acquiredLock)
-
06-07-2019 - |
質問
.Net4では、 Monitor.Enter(Object) は廃止とマークされています:
[ObsoleteAttribute("This method does not allow its caller to reliably release the lock. Please use an overload with a lockTaken argument instead.")]
public static void Enter(
Object obj
)
そして、新しいメソッド Monitor.Enter( lockObject、acquiredLock)この使用法で:
bool acquiredLock = false;
try
{
Monitor.Enter(lockObject, ref acquiredLock);
// Code that accesses resources that are protected by the lock.
}
finally
{
if (acquiredLock)
{
Monitor.Exit(lockObject);
}
}
以前はこのようにしていました:
Monitor.Enter(lockObject);
try
{
// Code that accesses resources that are protected by the lock.
}
finally
{
Monitor.Exit(lockObject);
}
間違っていますか?どうして ?
たぶん、入力後、試行の前に突発的でしょうか?
Eamon Nerbonneが尋ねたように:monitor.exitの直前に最終的に非同期例外がある場合はどうなりますか?
この例外が発生すると、 ランタイムは最終的にすべてを実行します スレッドを終了する前にブロックします。
解決
質問の最後で提案するように、問題は非同期例外は、 Monitor.Enter
の呼び出し後、 try
ブロックに入る前にスローされる可能性があります。
物事を行う新しい方法により、何が起こっても、最終ブロックに到達し、ロックを取得した場合 ロックを解除できるようになります。 (たとえば、 Monitor.Enter
が例外をスローした場合は取得できません。)
IIRC。これは、.NET 4.0を対象とした場合の lock
キーワードの新しい動作です。
所属していません StackOverflow