У меня есть этот метод здесь, в вызове службы 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;
}
я не вижу никаких доказательств того, что вы имеете дело с более чем одной нитью здесь ... так зачем его блокировать? –
, потому что он вызывается каждый раз, когда выполняется моя служба WCF. –
Вы не упомянули о том, что WCF участвовал здесь. Думали ли вы, что мы это сделали? –