基于WCF调用中的请求参数的并行性?

时间:2014-02-19 08:31:02

标签: c# wcf concurrency actor-model

是否有任何干净的方法让WCF调用根据请求参数应用最大并行度1?

假设以下代码:

 public void MyWcfOperation(int entityId, other arguments)
 {
      //do stuff with entity with id = entityId
 }

我想在这里基于entityId处理最多1个并行调用。 我知道我可以为WCF设置并发选项,但这是并发或单线程。但是当我需要为每个entityId进行单一调用时,将它设置为单个调用整个操作似乎有点过于激烈。

我认为我必须手动操作,但在这里我最好的选择是什么,不涉及演员模型库?

1 个答案:

答案 0 :(得分:1)

首先,考虑一下你是否真的需要根据ID进行同步。你是否预见到了扩大规模的问题?与往常一样,在寻求可能的过早优化之前,测试和基准测试是您的最佳选择。

也就是说,如果实体ID的数量不大,您可以使用这个简单的解决方案:

[ServiceBehavior(
   InstanceContextMode = InstanceContextMode.Single, // required to hold the dictionary through calls
   ConcurrencyMode = ConcurrencyMode.Multiple] // let WCF run all the calls concurrently
class Service
{
  private readonly ConcurrentDictionary<int, object> _locks = new ConcurrentDictionary<int, object>();

  public void MyWcfOperation(int entityId, other arguments)
  {
     lock (_locks.GetOrAdd(entityId, i => new Object())
     {
       // do stuff with entity with id = entityId
     }
  }
}

这不涉及清理,所以如果你有很多实体,那么字典就会增长到包含每个实体的锁定对象。