私は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が同時にアクセスすることができることをしたいですか? :-)
私はあなたのコードを正しく読んでも、一度に1つのリソースで作業しているわけではなく、いつでも最大で1つのスレッドでリソースを処理できます。リソースごとにロック可能なオブジェクトを持つほうが簡単ではないでしょうか? –
私はこれを達成しようとしている: *複数のスレッドで複数の異なるIDを持つ複数のエンティティを更新できるようにする必要があります。 * ID Xのエンティティを同時に更新することはできません。 "リソースごとにロック可能なオブジェクト"が何を意味するのかよくわかりません。あなたがリソースを再ソースすることを意味するならば、その量は無限であるため不可能です(この場合、リソースはリソースです) – damike
あなたはどのバージョンの.NETを使用していますか? ConcurrentBagにアクセスできますか?また、このコードは、特定のIDだけでなく、リストへのアクセス全体をブロックするので、WaitとPulseで余分なブロッキングを行う必要はありません。 –
oleksii