2012-01-14 20 views
1

私はWCFサービスとレコードを持つリソース(それらを識別するIDを持つ)を持っています。これまでの正しい実装です同時実行性 - 1リソースを1回編集する

public sealed class ConcurrencyIdManager 
{ 
    private static object _syncRootGrant = new object(); 
    private static List<int> _IdsInUse = new List<int>(); 

    ... // singleton   

    public void RequestAndWaitForIdGrant(int id) 
    { 
     lock (_syncRootGrant) 
     { 
      while (_IdsInUse.Where(i => i == id).Count() != 0) 
      { 
       Monitor.Wait(_syncRootGrant); 
      }    

      _IdsInUse.Add(id);     
     } 
    } 

    public void ReleaseGrantForId(int id) 
    { 
     lock (_syncRootGrant) 
     {     
      _IdsInUse.Remove(id); 

      Monitor.PulseAll(_syncRootGrant); 
     } 
    } 

は、だから私のWCFサービスでは、私は

public void UpdateMySpecialEntity(Entity foo) 
{ 
    ConcurrencyIdManager.Instance.RequestAndWaitForIdGrant(foo.Id); 
    try { 
     // do something with the entity foo 
    } 
    finally { ConcurrencyIdManager.Instance.ReleaseGrantForId(foo.Id); } 
} 

がありますので、私は少しリソースヘルパーを書かれている - 私は1つだけIDが同時にアクセスすることができることをしたいですか? :-)

+0

私はあなたのコードを正しく読んでも、一度に1つのリソースで作業しているわけではなく、いつでも最大で1つのスレッドでリソースを処理できます。リソースごとにロック可能なオブジェクトを持つほうが簡単ではないでしょうか? –

+0

私はこれを達成しようとしている: *複数のスレッドで複数の異なるIDを持つ複数のエンティティを更新できるようにする必要があります。 * ID Xのエンティティを同時に更新することはできません。 "リソースごとにロック可能なオブジェクト"が何を意味するのかよくわかりません。あなたがリソースを再ソースすることを意味するならば、その量は無限であるため不可能です(この場合、リソースはリソースです) – damike

+0

あなたはどのバージョンの.NETを使用していますか? ConcurrentBag にアクセスできますか?また、このコードは、特定のIDだけでなく、リストへのアクセス全体をブロックするので、WaitとPulseで余分なブロッキングを行う必要はありません。 – oleksii

答えて

0

あなたのノートを正しく読んでいるのであれば、IDの3,4,5は同時に編集したいが、id 5を持つ2つのスレッドはブロックしてお互いを待ちます。

この場合、ロックオブジェクトの並行コレクションを使用し、そのIDに対してオブジェクトに対して単純なロックを使用します。

擬似C#

ConcurrentDictionary<int,object> lockObjects = new ConcurrentDictionary<int,object) 
public void UpdateMySpecialEntity(Entity foo) 
{ 
    object idLock = lockObject.GetOrAdd(foo.id,new object()); 
    lock (idLock) 
    { 
    // do lock sensitive stuff in here. 
    } 
} 
+1

Thxたくさん!私はlockObjectsからコンテンツを時々安全に削除するにはどうすればいいですか? – damike

+0

lockObject.TryRemove(foo.id) –

関連する問題