1

AFAIKlock 、これら2つのバージョンには違いがあります。

フレームワーク4は、モニター入力中に例外が発生したかどうかのチェックをもう1つ追加しました(メモリ不足の例外など)。

また、ロックを(句内で)解放する必要があるかどうか(句内のコードが失敗したため)lockTakenを示すフラグがあります。finallytry

何かのようなもの

bool lockTaken = false;
try
{
   Monitor.Enter (lockObj, ref lockTaken);
   ...
}
finally { if (lockTaken) Monitor.Exit (lockObj); }

(コードと非常によく似ていusingます(dispose ...))

しかし、reflectorで見ると、まったく異なるものが表示されます。

[SecuritySafeCritical]
public static void Enter(object obj, ref bool lockTaken)
{
    if (lockTaken)
    {
        throw new ArgumentException(Environment.GetResourceString("Argument_MustBeFalse"), "lockTaken");
    }
    ReliableEnter(obj, ref lockTaken);
}

最後に、tryのパターンはどこにありますか?

私は何が欠けていますか?

4

1 に答える 1

3

lockフレームワークのコードを調べる代わりに、ステートメントを使用する逆コンパイルされたメソッドを調べる必要があります。したがって、次の方法で逆コンパイルしようとすると、次のようになります。

object syncRoot = new object();
void Foo()
{
  lock(syncRoot) {}
}

あなたはあなたが期待されているものを見るでしょう:

void Foo()
{
  bool lockTaken;
  try
  {
    Monitor.Enter(syncRoot, out lockTaken);
  }
  finally
  {
    if (lockTaken)
        Monitor.Exit(syncRoot);
  }
}
于 2012-11-29T12:01:39.920 に答える