質問

.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の直前に最終的に非同期例外がある場合はどうなりますか?

回答: ThreadAbortException

  

この例外が発生すると、   ランタイムは最終的にすべてを実行します   スレッドを終了する前にブロックします。

役に立ちましたか?

解決

質問の最後で提案するように、問題は非同期例外は、 Monitor.Enter の呼び出し後、 try ブロックに入る前にスローされる可能性があります。

物事を行う新しい方法により、何が起こっても、最終ブロックに到達し、ロックを取得した場合 ロックを解除できるようになります。 (たとえば、 Monitor.Enter が例外をスローした場合は取得できません。)

IIRC。これは、.NET 4.0を対象とした場合の lock キーワードの新しい動作です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top