ConcurrentBag строк и использования .Contains в Parallel.ForEach

Используйте @ (оператор управления ошибкой .) Это говорит, что php не выводит предупреждения в случае ошибок.

eval("\$result = @($expresion);");
if ($result == 0) {
    // do division by zero handling 
} else {
    // it's all good
}

0
задан CathalMF 20 February 2019 в 17:01
поделиться

1 ответ

ConcurrentBag является потокобезопасным, но ваш код не является:

if (!SystemNames.Contains(name))
{
    SystemNames.Add(name);
}

Contains будет выполняться потокобезопасным образом, затем Add также будет выполняться потокобезопасным , но у вас нет гарантии, что товар не был добавлен между ними.

Для ваших нужд я рекомендую использовать ConcurrentDictionary. Просто игнорируйте значение, так как оно вам не понадобится.

var SystemNames = new ConcurrentDictionary<string, bool>();

Затем используйте метод TryAdd, чтобы выполнить «если не содержит, то добавить» в одной атомарной операции:

SystemNames.TryAdd(name, true);
0
ответ дан Kevin Gosse 20 February 2019 в 17:01
поделиться
Другие вопросы по тегам:

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