之間,我有以下代碼:如何處理鎖聲明,如果有外部API調用
private static HashSet<SoloUser> soloUsers = new HashSet<SoloUser>();
public void findNewPartner(string School, string Major)
{
lock (soloUsers)
{
SoloUser soloUser = soloUsers.FirstOrDefault(s => (s.School == School) && (s.Major == Major));
MatchConnection matchConn;
if (soloUser != null)
{
if (soloUser.ConnectionId != Context.ConnectionId)
{
soloUsers.Remove(soloUser);
}
}
else
{ string sessionId = TokenHelper.GenerateSession();
soloUser = new SoloUser
{
Major = Major,
School = School,
SessionId = sessionId,
ConnectionId = Context.ConnectionId
};
soloUsers.Add(soloUser);
}
}
}
TokenHelper.GenerateToken(soloUser.Session)
和TokenHelper.GenerateModeratorToken(session);
可能是危險的,因爲他們可能需要一些時間來生成令牌。這會鎖定所有用戶,這可能是一個問題?有沒有對這個邏輯的任何解決方法,以便我仍然可以保持一切線程安全?
編輯: 我刪除了TokenHelper.GenerateToken(soloUser.Session)
和TokenHelper.GenerateModeratorToken(session)
,因爲我意識到,他們可以鎖定外發生,但每個SoloUser
有一個名爲SessionId
財產,這是爲每個用戶生成。 GenerateSession
方法也是一個需要一點時間的方法。每個用戶在添加到集合之前需要具有以下其中一個SessionId
s
您是否在關於鎖定UI線程或關於鎖定其他可能也想使用此數據的函數? – 2012-07-24 17:35:17
@JeffBridgman他使用ASP.NET。沒有「UI線程」。 – 2012-07-24 17:37:37
哦,我傻...沒有注意。抱歉! – 2012-07-24 17:38:39