C #: разница в производительности между «функцией с несколькими ожиданиями в асинхронных функциях» и «одной задачей в задаче, содержащей несколько функций синхронизации» - PullRequest
0 голосов
/ 20 мая 2019

Например, у нас есть два фрагмента кода:

  1. public static async Task TestAsync()  
    {
        await Task.Delay(5000);
    }        
    
    Task.Run(async () => 
    {
        for (int i = 0; i < 3; ++i)
        {
            await TestAsync();
        }
    }).Wait();
    
  2. public static void Test()
    {
        Task.Delay(5000).Wait();
    }
    
    Task.Run(() => 
    {
        for (int i = 0; i < 3; ++i)
        {
            Test();
        }
    }).Wait();
    

(Task.Delay просто представляет некоторыедолго выполняемое задание.)

Будет ли разница в производительности между двумя фрагментами кода?(Я проверил их, и кажется, что они имеют одинаковую производительность.)

Но, теоретически, 2) превзойдет 1) в какой-то ситуации?(Например, если в пуле потоков много потоков, ожидающих выполнения.)

1 Ответ

0 голосов
/ 20 мая 2019

Номер 2) фактически заблокирует поток, так как вы используете Wait.Поэтому наилучшей практикой будет использование подхода 1), независимо от вашей работы.Ожидание будет синхронно блокировать этот поток до тех пор, пока не будет завершена связанная задача.

Я знаю, что это может быть не тот ответ, который вы хотели, но вы также можете оформить заказ:

await vs Task.Wait -Тупик?

MSDN Статья Асинхронная / Ожидать лучшие практики

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...