У меня есть список, содержащий объекты, и я хочу параллельно выполнять операции с каждым элементом списка.Одна из этих операций включает изменение свойства объекта.Я думал, что это не должно вызывать проблем с безопасностью потоков, но мой модульный тест проваливается случайно, поэтому я волнуюсь, что есть состояние гонки.
Точный случай сбоя заключается в том, что тест завершится неудачно, сообщив, что список пуст, но только если я регулярно запускаю свой тест, если я запускаю в режиме отладки, проблема исчезает.Ни один из моего кода не должен удалять / добавлять элементы, список генерируется в начале, а затем никогда не изменяется напрямую, изменяются только сами элементы.
Безопасно ли изменение свойств классов в списке C # потока?
Вот код, о котором идет речь:
List<ExampleObject> localApplications = MethodThatProducesTheList();
Parallel.ForEach(localApplications, localitem =>
{
if (localitem.BuildLabel.Contains("_Release_"))
{
// Delete applications from the old system
var appToDelete = Path.Combine(AppRootPath, localitem.Name, localitem.BuildLabel);
DeleteDirectory(appToDelete);
}
else
{
var st = MethodThatGetsTheState(localitem.BuildLabel);
localitem.State.Add(st);
}
});
Вот более минимальный пример:
var object = new {
prop = "foo"
};
var list = new[] { object }.ToList();
Parallel.ForEach(list, listItem =>
{
listItem.prop = "bar";
});
if (list[0].prop != "bar") {
Assert.Fail()
}