Влияние производительности C # на асинхронную функцию, вызывающую асинхронную функцию - PullRequest
0 голосов
/ 25 мая 2018

Я писал код, в результате которого я вызывал асинхронный метод из другого асинхронного метода.Мне было интересно, как эта практика повлияет на производительность.Приводит ли это к использованию такого количества потоков для каждого асинхронного ожидания?

Пример поможет

public async Task<IHttpActionResult> ControllerMethod() 
{
    :
    return await A1();
}

public async Task<R1> A1() 
{
    :
    var result = await A2();
    if (result != null) 
    {  
        A3() 
    }
    return result;
}

public async Task<R1> A2() 
{
    :
    var result = await A4();
    return result;
}

public void A3() 
{
    :
    // call to another async method without await
}

Пожалуйста, помогите мне понять - это плохая практика?Это было результатом рефакторинга кода

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Затраты и производительность влияют на тот факт, что каждый метод, помеченный как асинхронный, передается за сцену в машину состояний;так что больше примеров кода и машины состояний, о которых нужно позаботиться.

Вы можете избежать машины состояний с перезаписью, как здесь ниже;вам не нужно ждать, если после этого оператора нет кода, просто верните задание, как описано в методе A2 ниже.

public Task<IHttpActionResult> ControllerMethod() 
{
    return A1();
}

public async Task<R1> A1() 
{
    var result = await A2();
    if (result !=  null)
    {  
        A3() 
    }
    return result;
}

public Task<R1> A2() 
{
    return A4();
}

public void A3() 
{
    // call to another async method without await
}
0 голосов
/ 25 мая 2018

Это совсем не плохая практика.Это наоборот, если небольшие методы, на которые вы разбиваете, выполняют некоторую работу, которая действительно требует асинхронных операций.Предположим, что в методе A4 () вы читаете данные из файла (операция связывания без CPU, для которой не требуется какой-либо поток из вашего пула потоков ASP .NET).Если вы не используете async в этой операции, ваш поток застрянет с операцией, которая ничего не делает, пока данные считываются из файла.

Напротив, если вы используете async, потоквернется в пул потоков, и пул потоков сможет обслуживать больше запросов с этим недавно освобожденным потоком.

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