私は次のコードを持っています:
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
、コレクションに追加する前に、これらのいずれかを持っている必要があります