我在這裏有一個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在這裏涉及。你認爲我們會推斷這一點嗎? –