这会导致执行时锁定吗?

时间:2017-01-31 19:27:47

标签: c# multithreading delegates locking

我在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;
    }

1 个答案:

答案 0 :(得分:2)

任何到达lock语句的线程都会在执行锁中的代码之前等待释放任何现有锁(在同一对象上)。

如果调用委托的代码未封装在锁中,则不会等待锁定释放执行..