Я пытаюсь определить, что Задачи МОГУТ выполняться параллельно в зависимости от решений, принятых планировщиком задач ... Как может быть так, что конечный результат в выполнении времени меньше, чем время, необходимое для выполнения каждого задача * количество задач и не доказать некоторую степень параллелизма?
Это доказывает параллелизм, который может быть асинхронным параллелизмом или параллелизмом. В этом случае ваш код выполняет асинхронный параллелизм.
Важно отметить, что планировщики задач применяются только к выполняющимся задачам, т. Е. Задачам, которые фактически выполняют код или заблокированы. Поток, который запускает await Task.Delay
, не выполняет код и не блокируется во время задержки.
Так что я имею в виду, может ли Task.wall быть параллельным или только параллельным?
Вы можете - теоретически - использовать WhenAll
параллельно. Вам просто нужно изменить код на блокирующий, а не асинхронный, и он будет работать параллельно:
var stopwatch = new Stopwatch();
stopwatch.Start();
var tasks = new List<Task>();
for (int i = 0; i < 50; i++)
{
tasks.Add(Task.Run(async () =>
{
Thread.Sleep(1000);
}));
}
await Task.WhenAll(tasks);
stopwatch.Stop();
var elapsedTime = stopwatch.ElapsedMilliseconds;
В этом случае ваш код работает параллельно. Использование Task.WhenAll
, как это будет работать, но это необычно. Обычно параллельный код потребляется с использованием методов блокировки, таких как Task.WaitAll
.