確定一些背景。我有一些與此類似:每個ASP.NET會話鎖定
class ConnectionFactory
{
public IConnection Connect()
{
if (User.IsAuthenticated) {
return InternalConnect(User.Username, null);
}
return null;
}
public IConnection Connect(string username, string password)
{
return InternalConnect(username, password);
}
private IConnection InternalConnect(string username, string password)
{
IConnection connection;
var cacheKey = Session[CacheKeySessionKey] as string;
if (!string.IsNullOrEmpty(cacheKey)) {
connection = HttpCache[cacheKey] as IConnection;
}
if (!IsGoodConnection(connection) {
connection = MakeConnection(username, password); // very costly
cacheKey = Session[CacheKeySessionKey] = // some key
HttpCache[cacheKey] = connection;
}
return connection;
}
private bool IsGoodConnection(IConnection conn)
{
return conn != null && conn.IsConnected;
}
}
目前,我正在運行到一個併發問題,其中即Connect()
被稱爲多次,每次請求創建多個IConnection
秒。我只需要一個。它正在使用IoC容器注入各種實例。 MakeConnnection
因爲它增加了一個WCF頻道而成本很高。
我的問題是:怎樣才能鎖定每個會話的InternalConnect
電話?我不認爲每個請求鎖定是正確的方式,因爲每個用戶可能會發生多個請求。我當然不想鎖定每一個電話,因爲這會導致糟糕的表現。
我認爲這樣做是一個壞主意:
lock(Session.SessionID)
{
// Implementation of InternalConnect
}
注:用戶名和密碼超載就是我所說的只登錄。
isgoodconnection是什麼意思? – Beatles1692 2012-02-16 13:17:10
@ Beatles1692 - 它只是一個方法來檢查它不是null或者它是否被斷開。 – 2012-02-16 13:18:40
您使用的是什麼IoC容器?你可以展示你的IoC配置嗎? – 2012-02-16 13:23:02