Диктонарный возвращаемый объект с числом -1 ArithemeticFlowException
Я столкнулся с проблемой переполнения арифметики. Я разместил подробности в этом вопросе [ Dictonary to ToList ArithmeticFlowException
Однако я нашел причину, когда я вызываю метод
Global.SereverConnections.TryGetValue(key, out connections);
он генерирует исключение переполнения, при этом количество соединений равно -1.
public static IDictionary<string, ISet<ConnectionManager>> SereverConnections = new ConcurrentDictionary<string, ISet<ConnectionManager>>();
public static IList<ConnectionManager> GetUserConnections(string username)
{
//Key must not be null in any case return null if someone send and empty username
if (string.IsNullOrEmpty(username))
return null;
ISet<ConnectionManager> connections;
Global.SereverConnections.TryGetValue(username, out connections);
//this will make the copy of the
//return (connections != null ? connections.ToList() ?? Enumerable.Empty<ConnectionManager>().ToList() : null);
//exception occurs in below line, and connections.Count==-1
return (connections != null ? connections.ToList() : null);
}
1 ответ
Global.SereverConnections
это ConcurrentDictionary
и, следовательно, является потокобезопасным. Но вы добавляете HashSet
с этим - и они не потокобезопасны.
Ты не можешь позвонить HashSet.ToList()
в то же время, когда кто-то добавляет элементы к нему.
Вам нужно будет использовать блокировку всех доступов к HashSet
чтобы убедиться, что у вас нет проблем с потоками. Или переключитесь на использование ConcurrentDictionary
вместо HashSet
(согласно /questions/6477023/parallelnyij-hashsett-vnet-framework