我有以下代碼。當部署到服務器,我得到例外,這個對象已經存在於字典。儘管如此,我做了雙重鎖定,同步並沒有很好地發揮作用。實現這個最好的方法是什麼?我怎樣才能最好地鎖定訪問本節?我應該實現一個單例類並將方法放在那裏?鎖定和簡單緩存
我應該鎖定集合還是互斥鎖?
NO我不是基於.NET 4
正如你所看到的,我想要做基於日期時間一個簡單的緩存。
// within the class.
IDictionary<id, MyObj> _mydict = new Dictionary<string, MyObj>();
object mutex = new object;
//within some method comes the following
if (_mydict.TryGetValue(id, out myobj))
{
DateTime now = DateTime.Now;
DateTime expiry = myobj.Timestamp;
TimeSpan span = now.Subtract(expiry);
if (span.Minutes 0)
{
lock (mutex)
{
myobj= DataAccess.GetMyObj(id);
_mydict[id] = myobj;
}
return myobj;
}
else
{
return myobj;
}
}
else
{
lock (mutex)
{
if (_mydict.TryGetValue(id, out myobj))
{
return myobj;
}
else
{
lock (mutex)
{
myobj = DataAccess.GetMyObj(id);
_mydict[id] = myobj;
}
return myobj;
}
}
}
如若第二個到最後的代碼行是'_myDict.Add(id,myobj)'? – 2011-03-01 01:10:28
它有關係嗎?我得到「這個項目已經在集合中」,這就是我爲什麼這樣做的原因。 – DarthVader 2011-03-01 01:22:26
如果我們看不到**完全**你在做什麼,很難說出什麼問題。 – 2011-03-01 02:20:11