170 похожих чатов

Ребят, всем привет. У меня есть: ConcurrentDictionary<WebSocketClient, WebSocket> _sockets = new ConcurrentDictionary<WebSocketClient,

WebSocket>();
Нужно получить список значений WebSocket по условию.
Какой метод правильнее и почему? Или оба фигня?

11 ответов

16 просмотров
Jan- Автор вопроса
Jan
screenshot

Смотря для чего. Зачем нужен parallel?

Jan- Автор вопроса
ioannis
Смотря для чего. Зачем нужен parallel?

Чтобы потом всем WebSocket, которые вернул метод, отправить сообщение. На кодревью сказали, что из ConcurrentDictionary извлекать значения чем-то помимо TryGetValue не стоит, но в моем случае TryGetValue не вариант. Насчет обычного foreach вместо Parallel.ForEach не знаю, прочитал, что лучше использовать второй вариант. Он вроде потокобезопасный, а первый вариант просто копию создает. Не уверен.

Jan
Чтобы потом всем WebSocket, которые вернул метод, ...

Ну перечисление по конкурентному словарю порождает новый список, который не меняется. Потому про второй метод даже не знаю, что не понравилось. А первый - ну он очень не очень. Складывать надо тоже через try*, в конкурентную коллекцию, да и непонятно, зачем параллельность в фильтрации, если ее не просят

Jan
Ок, спасибо

Про try*- это правильно. Потому что ты не можешь быть уверен, что объект там есть, даже если сам его только что положил туда, потому все методы через try, что бы не получать тяжёлых исключений, и перехватывать их, а проверять и поступать в зависимости от задачи.

Jan
screenshot

Оба варианта выглядят так, будто там race condition.

Jan- Автор вопроса
Dr. Friedrich von Never
Оба варианта выглядят так, будто там race conditio...

Меня, кажется, осенило. Раньше было: 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); Всем спасибо за помощь=)

Dr. Friedrich von Never
screenshot

дальше будет как у тебя на аватарке?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта