Когда не стоит использовать await asyn c? - PullRequest
7 голосов
/ 13 марта 2020

У меня есть проект ASP. NET Core 3.1, написанный с использованием C#. Мне известно, что лучше всего использовать await и async при доступе к внешним ресурсам, таким как извлечение данных из базы данных, доступ к файлам или выполнение HTTP-запроса. Это освобождает поток, так что вместо этого выполняется больше работы, чтобы поток бездействовал в ожидании завершения кода sh.

Однако я пытаюсь выяснить, в какой момент использование async/await снизит производительность ? Выполняется ли процесс освобождения потока при вызове await и извлечения потока после завершения задачи?

Следующий код вызывается асинхронно. На самом деле этот код не нужно вызывать асинхронно, поскольку весь код выполняется в памяти и внешние запросы не выполняются.

public interface ILocator
{
    Task<Model> ExampleAsync();
}

public class Example : Controller
{
    public ILocator Locator { get; set; }

    public Example(ILocator locator)
    {
        Locator = locator;
    }

    public async Task<IActionResult> Example()
    {
        Model model = await Locator.ExampleAsync();

        return View(model);
    }
}

public class Locator : ILocator
{
    pubilc Task ExampleAsync()
    {
        Example model = new Example();
        model.Status = "New";

        return Task.CompletedTask;
    }
}

Вот синхронная версия приведенного выше кода

public interface ILocator
{
    Model Example();
}

public class Example : Controller
{
    public ILocator Locator { get; set; }

    public Example(ILocator locator)
    {
        Locator = locator;
    }

    public IActionResult Example()
    {
        Model model = Locator.Example();

        return View(model);
    }
}

public class Locator : ILocator
{
    pubilc Example()
    {
        Example model = new Example();
        model.Status = "New";
    }
}

Будет ли асинхронная версия кода иметь более высокую стоимость / более низкую производительность, чем синхронная версия, из-за ненужного использования await/async?

Когда async/await принесет больше вреда, чем пользы?

Ответы [ 2 ]

8 голосов
/ 13 марта 2020

Обычно вы используете async/await при выполнении задач, связанных с вводом / выводом, таких как чтение из потока, чтение из БД, отправка чего-либо по сети или ожидание ответа.

Это делает поток доступным для выполнять некоторые другие (связанные с процессором работы).

Технически async / await медленнее с точки зрения необработанной производительности, однако увеличивает масштабируемость вашего приложения, поскольку позволяет потокам быть доступными для другой работы, в то время как другие ожидание операций ввода-вывода.

3 голосов
/ 14 марта 2020

У меня есть ASP. NET Core 3.1 основанный проект, написанный с использованием C#.

Это означает, что async / await позволит вам значительно увеличить вашу емкость (в запросах на секунду).

В какой момент использование async / await снизит производительность?

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

Когда асинхронизация / ожидание принесет больше вреда, чем пользы?

На веб-сайте / сервисе, который никогда не увидит нагрузку выше ~ 50 запросов / секунду.
И даже тогда «вред» будет очень маленьким.

Фактические цифры зависят от аппаратного обеспечения, количества операций ввода-вывода и т. Д. c.

В действительности этот код не нужно вызывать асинхронно, так как весь код выполняется в памяти

В этом случае будет быстрее обрабатывать его синхронно.
Но я знаю команды, которые предпочитают, чтобы все Действия асин c, только для единообразия. И поскольку накладные расходы такие маленькие, я считаю, что это тоже правильный подход.

...