Чтобы потом всем WebSocket, которые вернул метод, отправить сообщение. На кодревью сказали, что из ConcurrentDictionary извлекать значения чем-то помимо TryGetValue не стоит, но в моем случае TryGetValue не вариант. Насчет обычного foreach вместо Parallel.ForEach не знаю, прочитал, что лучше использовать второй вариант. Он вроде потокобезопасный, а первый вариант просто копию создает. Не уверен.
Ну перечисление по конкурентному словарю порождает новый список, который не меняется. Потому про второй метод даже не знаю, что не понравилось. А первый - ну он очень не очень. Складывать надо тоже через try*, в конкурентную коллекцию, да и непонятно, зачем параллельность в фильтрации, если ее не просят
Про try*- это правильно. Потому что ты не можешь быть уверен, что объект там есть, даже если сам его только что положил туда, потому все методы через try, что бы не получать тяжёлых исключений, и перехватывать их, а проверять и поступать в зависимости от задачи.
Оба варианта выглядят так, будто там race condition.
Меня, кажется, осенило. Раньше было: ConcurrentDictionary<WebSocketClient, WebSocket> _sockets Сделаю так: ConcurrentDictionary<WebSocketClient, ConcurrentDictionary<ConnectionType, ConcurrentDictionary<string, WebSocket>>> _sockets (где string - уникальный ид соединения) Тогда в метод можно будет передать: WebSocketClient wsClient (состоит из ProjectId и StreamId) и ConnectionType connectionType И вытащить список нужных вебсокетов через _sockets.TryGetValue(wsClient, out var connectionsByType); connectionsByType.TryGetValue(connectionType, out var connections); Всем спасибо за помощь=)
дальше будет как у тебя на аватарке?
Обсуждают сегодня