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

  • Автор темы Автор темы dihard
  • Дата начала Дата начала

dihard

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

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

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

Вопрос, когда я добавляю строки в ConcurrentDictionary , это будут видеть все потоки или для каждого будет свой ConcurrentDictionary
 
Ну если вот прям в таком виде пихнуть в кубик c# , то это локальная переменная.
Если пихнешь в статический класс в общем коде, тогда потоки этого же проекта будут видеть эту конструкцию как общую.
Если нужна видимость между проектами, то придется этот объект пихать в глобальную переменную.
 
  • Спасибо
Реакции: dihard
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 не удается создать, будет ли так работать. Как вообще проверить такой код в многопотоке
 
Я делаю 1 запрос, вижу что добавляется в таблицу, по идее уникальный id должен уже лежать в
ConcurrentDictionary. Но он дает еще добавить, нажимаю по 2 раза сделать код , добавляет 2 раза все. Делаю вывод - не работает. Может есть способ проще исключать значения в многопотоке?
 
Без статики смысла нет .. Это будет объект текущего потока, не более. Тем более при создании в кубике объекта из публичного класса это временная конструкция уничтожаемая при выходе из кубика.
Посмотри как статика в стандартной заготовке сделана в общем коде и сделай по примеру. А лучше попроси ИИ написать кусок кода для того класса.
 
Без статики смысла нет .. Это будет объект текущего потока, не более. Тем более при создании в кубике объекта из публичного класса это временная конструкция уничтожаемая при выходе из кубика.
Посмотри как статика в стандартной заготовке сделана в общем коде и сделай по примеру. А лучше попроси ИИ написать кусок кода для того класса.
Дело в том что даже с первым кодом ничего не работает в
ConcurrentDictionary пусто - всегда. И я не понимаю почему
 
Дело в том что даже с первым кодом ничего не работает в
ConcurrentDictionary пусто - всегда. И я не понимаю почему
ИИ помучай... Как бы свойство readonly не располагает к записи...
 
ИИ помучай... Как бы свойство readonly не располагает к записи...
C#:
Развернуть Свернуть Копировать
ConcurrentDictionary<string, bool> processedData = new ConcurrentDictionary<string, bool>();

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

if (!processedData.TryAdd(data, true)) {
        continue; // Если data уже существует, пропускаем итерацию
    }
Я про этот код, он даже локально не работает)
 
C#:
Развернуть Свернуть Копировать
ConcurrentDictionary<string, bool> processedData = new ConcurrentDictionary<string, bool>();

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

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

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

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

Вообще и не должен работать... Объект то нестатичный... А по этому куску кода оторванного от контекста всего кода, хрен его вообще знает...
 
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 уже существует, пропускаем текущаю итерацию и переходим к следующей
    }
}
}
Упрощенно так, по идеи это должно работать
 
Последнее редактирование:

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