2017-01-31 63 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

這是我在想什麼......改變你的答案......即使這似乎更多的意見。 –