2

このコンストラクタの定義に出くわしましたObject(からのメタデータmscorlib.dll

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public Object();

ConstrainedExecution( ) が何を意味するのか理解できませんでしたCer.MayFail。この場合の例を教えてください。

私はこのコードに出くわしました。また、このように書くのが正しいかどうか教えてください。

public class MyClass
{
    private static object instanceLock = new object();

    private void Func()
    {
        bool instanceLockTaken = false;

        Monitor.TryEnter(instanceLock, ref instanceLockTaken);
        //...
        Monitor.Exit(instanceLock);
    }
}
4

4 に答える 4

4

制約付き実行は、スレッドをロックすることによって達成しようとしていることです。

出典: http://msdn.microsoft.com/en-us/magazine/cc163716.aspx

MayFail の Cer 値は、非同期例外が発生した場合に、コードが期待どおりに完了しない可能性があることを通知するために使用されます。制約された実行領域でスレッドの中止が遅れているため、これは実際には、メモリが割り当てられる可能性がある、またはスタック オーバーフローが発生する可能性がある何かをコードが実行していることを意味します。さらに重要なことは、このメソッドを呼び出すときに起こりうる障害を考慮する必要があることです。

あなたの場合、オブジェクトは静的で一度しか作成されないため、これは問題になりません。

Monitor.TryEnterロックが取得されていない場合でも、すぐに戻ります。チェックしていないブール値があり、次のようなものが機能します。

Monitor.TryEnter(instanceLock, ref instanceLockTaken);

  if (instanceLockTaken) 
  {
    // Do stuff here

    Monitor.Exit(instanceLock);
  }

ただし、このコードはif {}ブロックが毎回実行されないことを意味します。すべてのスレッドでロックを取得したい場合は、次のようにする必要があります。

lock(instanceLock)
{
  // Do stuff here
}

これは、一度に 1 つのスレッドだけがステートメントの内容を実行できlock {}、lock ステートメントの内容が毎回実行されることを意味します。

ちなみに、ロックしているオブジェクトを作成することもできますreadonly

private static readonly object instanceLock = new object();

于 2012-08-27T11:47:01.630 に答える
2

一般的に言えば、ここで 2 つの質問があります。

1) 信頼性コントラクトは、CLR チームが制約のある実行領域をサポートするために使用するツールです。これは高度なトピックですが、簡単に言えば、関数 (またはコンストラクター) が失敗する可能性があるかどうか、および失敗した場合の影響 (影響なし、appDomain への影響、プロセスへの影響、マシン全体のクラッシュなど) を説明する構造です。

2) コード スニペットが正しくありません。それ以上チェックしないのに、なぜ保存instanceLockTakenするのですか?また、ロックの取得から解放までの間に例外が発生すると、ロックを漏らしてしまいます。lock次のような構文糖衣であるステートメントの使用を検討してください。

    bool instanceLockTaken = false;
    try
    {
      Monitor.Enter(instanceLock, ref instanceLockTaken);

    //...
    }
    finally
    {
      if (instanceLockTaken) 
      {
         Monitor.Exit(instanceLock);
      }
    }
于 2012-08-27T11:47:35.750 に答える
0

これは、モニターをロックするための正しい方法です。

bool isLocked = false;
try
{
 Monitor.Enter(instanceLock , ref isLocked);
 // Do some things within the lock    
}
finally
{
 if (isLocked) Monitor.Exit(instanceLock);
}

cer.mayfailに関しては、このリンクはいくつかの詳細情報を提供しますhttp://weblogs.asp.net/justin_rogers/archive/2004/10/05/238275.aspx

于 2012-08-27T11:53:33.903 に答える
0

Cer.Mayfail キーワードは、マークされたメソッドが例外をスローした場合、データが無効な状態になる可能性があることを意味します。オブジェクトの以前の状態は復元されません。

于 2012-08-27T11:47:14.760 に答える