Диктонарный возвращаемый объект с числом -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

Другие вопросы по тегам