Parallel.ForEachAsync не меняет свойства элементов IEnumerable.C#

Место общения программистов C#
Ответить
Anonymous
 Parallel.ForEachAsync не меняет свойства элементов IEnumerable.

Сообщение Anonymous »

У меня есть следующий класс

Код: Выделить всё

class Person
{
public required string Name { get; set; }
public required string Lastname { get; set; }

public override string ToString() => $"{Name} - {Lastname}";
}
Затем я создаю коллекцию Person:

Код: Выделить всё

 // dummy data
IEnumerable persons = Enumerable.Range(0, 1000).Select(index => new Person()
{
Name = index.ToString(),
Lastname = index.ToString() + "^"
});
После этого, если я попытаюсь изменить элементы с помощью Parallel.ForEachAsync
Фактические люди внутри IEnumerable не изменятся< /p>

Код: Выделить всё

await ChangeByParallel(persons); // does not change the items inside IEnumerable

static async Task ChangeByParallel(IEnumerable persons)
{
await Parallel.ForEachAsync(persons, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
async (person, token) =>
{
person.Name = "Ermalo";
person.Lastname = "Magradze";
await Task.Delay(100);
});
}
Я обнаружил, что если я превращу IEnumerable в List, проблема будет устранена, и
данные внутри List изменено.

Код: Выделить всё

IEnumerable persons = Enumerable.Range(0, 1000).Select(index => new Person()
{
Name = index.ToString(),
Lastname = index.ToString() + "^"
}).ToList(); // ToList  added, So that underlying collection is list now.

await ChangeByParallel(persons); // working

static async Task ChangeByParallel(IEnumerable persons)
{
await Parallel.ForEachAsync(persons, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
async (person, token) =>
{
person.Name = "Ermalo";
person.Lastname = "Magradze";
await Task.Delay(100);
});
}
Даже если я нашел решение, все еще не понимаю, почему ToList исправляет эту проблему.
Я знаю, что IEnumerable
Я знаю, что IEnumerable code> загружается отложенно, но при отладке этого кода я вижу, что выполняется параллельный код. Кроме того, я не использую структуру, чтобы думать, что элементы IEnumerable копируются.
Итак, мне интересно, почему Parallel.ForEachAsync не меняет элементы IEnumerable .

Подробнее здесь: https://stackoverflow.com/questions/793 ... able-items
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»