2017-01-31 11 views
-3

У меня есть этот метод здесь, в вызове службы 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); 

Первый вызов будет добавить в словарь, последующие вызовы не нужно добавлять в статический словарь, но 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

я не вижу никаких доказательств того, что вы имеете дело с более чем одной нитью здесь ... так зачем его блокировать? –

+0

, потому что он вызывается каждый раз, когда выполняется моя служба WCF. –

+0

Вы не упомянули о том, что WCF участвовал здесь. Думали ли вы, что мы это сделали? –

ответ

2

Любой поток достигает lock заявление будет ждать каких-либо существующих замков (на тот же объект) будет выпущен перед выполнением кода внутри замка.

Если ваш код, который вызывает делегат не инкапсулируется в замке, он не будет ждать релиза блокировки для выполнения ..

+0

Я знаю, что мой вопрос о делегате, делегат не выполняет до тех пор, пока после этого метода –

+0

это то, что я думаю ... измените свой ответ ... даже если это кажется скорее мнением. –