Код: Выделить всё
class Person
{
public required string Name { get; set; }
public required string Lastname { get; set; }
public override string ToString() => $"{Name} - {Lastname}";
}
Код: Выделить всё
// dummy data
IEnumerable persons = Enumerable.Range(0, 1000).Select(index => new Person()
{
Name = index.ToString(),
Lastname = index.ToString() + "^"
});
Фактические люди внутри 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);
});
}
данные внутри 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);
});
}
Я знаю, что IEnumerable
Я знаю, что IEnumerable code> загружается отложенно, но при отладке этого кода я вижу, что выполняется параллельный код. Кроме того, я не использую структуру, чтобы думать, что элементы IEnumerable копируются.
Итак, мне интересно, почему Parallel.ForEachAsync не меняет элементы IEnumerable .
Подробнее здесь: https://stackoverflow.com/questions/793 ... able-items
Мобильная версия