我在WCF服务调用中有这个方法,检查Dictionary
然后在没有密钥的情况下添加它。我在锁定区块内创建了一个Delegate
,想知道这是否有问题。
if (_delegates.ContainsKey(req.OperationName))
{
return _delegates[req.OperationName](req);
}
else
{
lock (_syncRoot)
{
if (_delegates.ContainsKey(req.OperationName) == false)
{
System.Reflection.MethodInfo mi = GetType().GetMethod(req.OperationName, new Type[] { typeof(DataRequestContext) });
if (mi != null)
{
InvokeDelegate d = new InvokeDelegate((r) => { return mi.Invoke(this, new object[] { r }); });
_delegates.Add(req.OperationName, d);
}
else
{
throw new Exception("Unsupported operation: " + req.OperationName);
}
}
return _delegates[req.OperationName](req);
}
上面的代码执行方式如下:
var del = GetDelegate( request);
del(request);
第一个调用将添加到Dictionary中,后续调用不需要添加到静态Dictionary,但每次运行代码时都会执行Delegate
。
我的大脑说这个代码段不会阻塞,我是否正确?
InvokeDelegate d = new InvokeDelegate((r) => { return mi.Invoke(this, new object[] { r }); });
我无法测试它并产生锁定条件所以我需要问:
在真实场景中实际执行的代码如下,参数req
是一个包含我用来执行的运行时值的对象:
public AES.Cloud.Common.DataDictionary GetConditionAndItems(AES.Cloud.Common.DataRequestContext req)
{
List<ConditionItem> items = null;
List<MiscItem> miscitems = null;
var cond = GetConditionAndItems(req.GetValue<Guid>("conditionId"), out items, out miscitems);
AES.Cloud.Common.DataDictionary dd = new Common.DataDictionary();
dd.AddList("items", items);
dd.AddList("miscItems", miscitems);
dd.AddObject("Condition", cond);
return dd;
}
答案 0 :(得分:2)
任何到达lock
语句的线程都会在执行锁中的代码之前等待释放任何现有锁(在同一对象上)。
如果调用委托的代码未封装在锁中,则不会等待锁定释放执行..