все зависит от потоков, скажем, у вас есть следующий класс
public class person
{
public int ID { get; set; }
public string Name { get; set; }
}
и вот ваш основной класс
List<person> persons = new List<person>()
{
new person{ ID = 1,Name="Ali"}
,new person{ ID = 2,Name="Gorge"}
,new person{ ID = 3,Name="Alex"}
,new person{ ID = 4,Name="Liz"}
,new person{ ID = 5,Name="Scott"}
,new person{ ID = 6,Name="Abby"}
,new person{ ID = 7,Name="Sarah"}
};
Parallel.ForEach(persons, (p) =>
{
Console.WriteLine($"Id : {p.ID} ,Name : {p.Name}");
});
Когда вы запустите этот код, элементы списка будутбыть разделен на потоки diff, и код не будет работать по порядку, как вы видите в следующем выводе, я получаю печать в порядке diff, чем мой оригинальный список
и здесьЯ запускаю тот же код еще раз, но я получаю результаты сравнения
Причина в том, что из-за потоков компилятор делится на числопотоков и каждый список запускает элементы, назначенные ему на следующем рисунке показаны различия потоков
, но при запуске следующий код
List<person> persons = new List<person>()
{
new person{ ID = 1,Name="Ali"}
,new person{ ID = 2,Name="Gorge"}
,new person{ ID = 3,Name="Alex"}
,new person{ ID = 4,Name="Liz"}
,new person{ ID = 5,Name="Scott"}
,new person{ ID = 6,Name="Abby"}
,new person{ ID = 7,Name="Sarah"}
};
await persons.ForEachAsync(async p => Console.WriteLine($"Id : {p.ID} ,Name : {p.Name}"));
вы получаете только одну нить, как показано здесь
плюс печать данных всегда будет выполняться в том же порядке из вашего списка
Надеюсь, этот ответ объясняет разницу!