Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Оптимизация асинхронных методов

iweywey weywey Ученик (131), на голосовании 2 месяца назад
Почему данный код:
await PrintNameAsync("Tom");
await PrintNameAsync("Bob");
await PrintNameAsync("Sam");

// определение асинхронного метода
async Task PrintNameAsync(string name)
{
await Task.Delay(3000); // имитация продолжительной работы
Console.WriteLine(name);
}
выполнится медленнее чем другой:
var tomTask = PrintNameAsync("Tom");
var bobTask = PrintNameAsync("Bob");
var samTask = PrintNameAsync("Sam");

await tomTask;
await bobTask;
await samTask;
// определение асинхронного метода
async Task PrintNameAsync(cstring name)
{
await Task.Delay(3000); // имитация продолжительной работы
Console.WriteLine(name);
}
Вроде же и там и там просто вызывают метод, но в последнем примере их для чего-то присваивают куда-то а затем, как я понял, записывают в конце программы с await чтобы они завершились после некоторых действий. Пожалуйста, обьясните в чем разница между этими двумя кодами. Только без нейросетей
Голосование за лучший ответ
V̲i̲s̲t̲a̲s̲t̲e̲r̲ Искусственный Интеллект (258850) 3 месяца назад
во втором варианте параллельно запускается. Сравнить можно так
 using System; 
using System.Diagnostics;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
var stopwatch = Stopwatch.StartNew();
Console.WriteLine("Последовательное выполнение:");
await DoSequentialAsync();
stopwatch.Stop();
Console.WriteLine($"Время последовательного выполнения: {stopwatch.ElapsedMilliseconds} мс");
Console.WriteLine("\nПараллельное выполнение:");
stopwatch.Restart();
await DoParallelAsync();
stopwatch.Stop();
Console.WriteLine($"Время параллельного выполнения: {stopwatch.ElapsedMilliseconds} мс");
}

static async Task DoSequentialAsync()
{
await PrintNameAsync("Tom");
await PrintNameAsync("Bob");
await PrintNameAsync("Sam");
}

static async Task DoParallelAsync()
{
var tomTask = PrintNameAsync("Tom");
var bobTask = PrintNameAsync("Bob");
var samTask = PrintNameAsync("Sam");

await Task.WhenAll(tomTask, bobTask, samTask);
}

static async Task PrintNameAsync(string name)
{
await Task.Delay(200);
Console.WriteLine(name);
}
}
Похожие вопросы