是否有任何干净的方法让WCF调用根据请求参数应用最大并行度1?
假设以下代码:
public void MyWcfOperation(int entityId, other arguments)
{
//do stuff with entity with id = entityId
}
我想在这里基于entityId处理最多1个并行调用。 我知道我可以为WCF设置并发选项,但这是并发或单线程。但是当我需要为每个entityId进行单一调用时,将它设置为单个调用整个操作似乎有点过于激烈。
我认为我必须手动操作,但在这里我最好的选择是什么,不涉及演员模型库?
答案 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
}
}
}
这不涉及清理,所以如果你有很多实体,那么字典就会增长到包含每个实体的锁定对象。