2011-11-18 34 views
5

私は作成されたコードを見ていて、1つのメソッド呼び出しでTryEnterを使用し、他のメソッド呼び出しでロックします。したがって、次のようになります。Monitor.TryEnterとlock()は一緒に動作しますか?

private readonly object xmppLock = new object(); 

void f1() 
{ 
    if (Monitor.TryEnter(xmppLock)) 
    { 
     try 
     { 
      // Do stuff 
     } 
     finally 
     { 
      Monitor.Exit(xmppLock); 
     } 
    } 
} 

void f2() 
{ 
    lock(xmppLock) 
    { 
     // Do stuff 
    } 
} 

これは大丈夫ですか?リソースが利用可能になるまで

答えて

2

ロックがブロックされます

TryEnterがすでにロックされている場合は何もしません。

必要に応じて、どちらか一方を使用する必要があります。

あなたのケースでは、f2()は、どれくらい時間がかかっても常にこれまで何をしています。 f1()はロック競合が発生した場合にすぐに戻ります

+0

これは、同じオブジェクトで、** lock **とMonitor.TryEnterを混在させることが可能かどうかという質問には答えません。 [Try類似の質問への回答を参照](https://stackoverflow.com/q/14377366/199364) – ToolmakerSteve

8

lockMonitor.Enterの構文砂糖ですので、正常に動作します。 (Typeオブジェクトのような公共の何かにロックする貧しいフォームと考えられています、と述べた。)

The Visual Basic SyncLock and C# lock statements use Monitor.Enter to take the lock and Monitor.Exit to release it. The advantage of using the language statements is that everything in the lock or SyncLock block is included in a Try statement.

+0

これは答えません** TryEnter ** OPが使用する –

+0

「TryEnter」を使用してロックを取得することは明らかですある場所で別の場所で 'Enter'を使ってそれを取得することと一緒に働くので、住む価値はありません。 – mquander

4

はいこれら2つの構築物が一緒に動作します。 C#lockキーワードは、Monitor.EnterMonitor.TryEnterメソッドの単なる薄いラッパーです。

注:ロックオンの値としてTypeインスタンスを使用することは絶対に避けてください。これは非常に脆弱です。なぜなら、2つの完全に無関係なコードが同じオブジェクトに予期せずロックされることを非常に簡単にするからです。これはデッドロックにつながります。

+0

typeof()に関するポインタをありがとう。私は編集中のコードではなく、何が起こっているのかを知りたいと思っていたので、私はそれが何をしているのか分からなかったので、これに関する別の質問をしました。 – Firedragon

関連する問題