Потокобезопасное исключение значений

dihard

Client
Регистрация
08.11.2019
Сообщения
307
Благодарностей
48
Баллы
28
Добрый день, есть вопрос, появилась необходимость исключать значение по уникальному идентификатору в многопотоке.
Я использую так
C#:
ConcurrentDictionary<string, bool> processedData = new ConcurrentDictionary<string, bool>();

string data; //тут часть кода я формирую эту переменную по которой буду исключать

if (!processedData.TryAdd(data, true)) {
        continue; // Если data уже существует, пропускаем итерацию
    }
Вопрос, когда я добавляю строки в ConcurrentDictionary , это будут видеть все потоки или для каждого будет свой ConcurrentDictionary
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
532
Благодарностей
138
Баллы
43
Ну если вот прям в таком виде пихнуть в кубик c# , то это локальная переменная.
Если пихнешь в статический класс в общем коде, тогда потоки этого же проекта будут видеть эту конструкцию как общую.
Если нужна видимость между проектами, то придется этот объект пихать в глобальную переменную.
 
  • Спасибо
Реакции: dihard

dihard

Client
Регистрация
08.11.2019
Сообщения
307
Благодарностей
48
Баллы
28
C#:
public class UniqueDataTracker
{
    private readonly ConcurrentDictionary<string, bool> processedData;

    public UniqueDataTracker()
    {
        processedData = new ConcurrentDictionary<string, bool>();
    }

    public bool TryAdd(string data)
    {
        return processedData.TryAdd(data, true);
    }
}
static не удается создать, будет ли так работать. Как вообще проверить такой код в многопотоке
 

dihard

Client
Регистрация
08.11.2019
Сообщения
307
Благодарностей
48
Баллы
28
Я делаю 1 запрос, вижу что добавляется в таблицу, по идее уникальный id должен уже лежать в
ConcurrentDictionary. Но он дает еще добавить, нажимаю по 2 раза сделать код , добавляет 2 раза все. Делаю вывод - не работает. Может есть способ проще исключать значения в многопотоке?
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
532
Благодарностей
138
Баллы
43
Без статики смысла нет .. Это будет объект текущего потока, не более. Тем более при создании в кубике объекта из публичного класса это временная конструкция уничтожаемая при выходе из кубика.
Посмотри как статика в стандартной заготовке сделана в общем коде и сделай по примеру. А лучше попроси ИИ написать кусок кода для того класса.
 

dihard

Client
Регистрация
08.11.2019
Сообщения
307
Благодарностей
48
Баллы
28
Без статики смысла нет .. Это будет объект текущего потока, не более. Тем более при создании в кубике объекта из публичного класса это временная конструкция уничтожаемая при выходе из кубика.
Посмотри как статика в стандартной заготовке сделана в общем коде и сделай по примеру. А лучше попроси ИИ написать кусок кода для того класса.
Дело в том что даже с первым кодом ничего не работает в
ConcurrentDictionary пусто - всегда. И я не понимаю почему
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
532
Благодарностей
138
Баллы
43
Дело в том что даже с первым кодом ничего не работает в
ConcurrentDictionary пусто - всегда. И я не понимаю почему
ИИ помучай... Как бы свойство readonly не располагает к записи...
 

dihard

Client
Регистрация
08.11.2019
Сообщения
307
Благодарностей
48
Баллы
28
ИИ помучай... Как бы свойство readonly не располагает к записи...
C#:
ConcurrentDictionary<string, bool> processedData = new ConcurrentDictionary<string, bool>();

string data; //тут часть кода я формирую эту переменную по которой буду исключать

if (!processedData.TryAdd(data, true)) {
        continue; // Если data уже существует, пропускаем итерацию
    }
Я про этот код, он даже локально не работает)
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
532
Благодарностей
138
Баллы
43
C#:
ConcurrentDictionary<string, bool> processedData = new ConcurrentDictionary<string, bool>();

string data; //тут часть кода я формирую эту переменную по которой буду исключать

if (!processedData.TryAdd(data, true)) {
        continue; // Если data уже существует, пропускаем итерацию
    }
Я про этот код, он даже локально не работает)
Ну он не валидный потому что... Continue вообще там к чему ?
Юзинги еще надо прописать нужные...

Говорю же... Опиши задачу подробно ИИ, без кода, он сам придумает что то рабочее. Потом можно доуточнять и править
 

dihard

Client
Регистрация
08.11.2019
Сообщения
307
Благодарностей
48
Баллы
28
Ну он не валидный потому что... Continue вообще там к чему ?
Юзинги еще надо прописать нужные...

Говорю же... Опиши задачу подробно ИИ, без кода, он сам придумает что то рабочее. Потом можно доуточнять и править
Continue чтобы пропустить ненужную итерацию, юзинги прописаны. Уже пол часа мучаю, он уверен что все правильно в коде))
 

Alex91

Активный пользователь
Регистрация
15.08.2024
Сообщения
532
Благодарностей
138
Баллы
43
Continue чтобы пропустить ненужную итерацию, юзинги прописаны. Уже пол часа мучаю, он уверен что все правильно в коде))
Остается только приложить шаблон с правильным кодом, что бы гуру могли запустить у себя и внести правки... ;-)

Вообще и не должен работать... Объект то нестатичный... А по этому куску кода оторванного от контекста всего кода, хрен его вообще знает...
 

Oleg1987

Client
Регистрация
11.08.2014
Сообщения
1 250
Благодарностей
790
Баллы
113

dihard

Client
Регистрация
08.11.2019
Сообщения
307
Благодарностей
48
Баллы
28
C#:
if (count_data > 0) {
ConcurrentDictionary<string, bool> processedData = new ConcurrentDictionary<string, bool>();
for (int i = 1; i < count_data; i++) {
string data; // получай id
if (!processedData.TryAdd(data, true)) {
        continue; // Если data уже существует, пропускаем текущаю итерацию и переходим к следующей
    }
}
}
Упрощенно так, по идеи это должно работать
 
Последнее редактирование:

Кто просматривает тему: (Всего: 4, Пользователи: 0, Гости: 4)