Использование асинхронного шаблона ожидания из статического метода, когда параллелизм не требуется

Есть ли польза от использования шаблона async/await, когда вы работаете синхронно?

Например, в моем приложении у меня есть статические методы, которые вызываются cron (hangfire) для выполнения различных задач, связанных с вводом-выводом. Простой надуманный пример таков:

static void Run(string[] args)
{
    var data = Test(args);

    //..do stuff with returned data
}

public static List<string> Test(string[] args)
{
    return Db.Select(args);
}

Есть ли какое-либо преимущество в написании этого кода так:

static void Run(string[] args)
{

    var dataTask = await TestAsync(args);
    dataTask.Wait();

    //..do stuff with returned data
}

public static async Task<List<string>> TestAsync(string[] args)
{
    return await Db.SelectAsync(args);
}

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

Если я напишу свой код с этим типом шаблона в своих статических методах, он будет выглядеть так:

var data = someMethod();
data.Wait();
var data2 = someOtherMethod(data);
data2.Wait();

Я понимаю, что использование асинхронного шаблона ожидания при запуске множества одновременных задач, но когда код исходит из статического метода и должен выполняться в таком порядке, есть ли вообще какая-то польза? Каким образом я должен написать это?


person Guerrilla    schedule 10.11.2018    source источник
comment
Вы действительно комбинируете await и Wait() в производственном коде? Если да, то почему?   -  person Peter Bons    schedule 10.11.2018
comment
упс отредактировал. Спасибо   -  person Guerrilla    schedule 10.11.2018


Ответы (1)


так как он добавляет внутреннюю оптимизацию, но он не может объяснить, почему это так

Меня поражает, как много людей считают, что асинхронность — всегда лучший выбор, но не могут объяснить, почему. Это большое недоразумение в обществе. К сожалению, Microsoft как бы продвигает эту идею. Я считаю, что они делают это, чтобы упростить руководство.

Async IO помогает в двух вещах: 1) сохранить потоки 2) упростить приложения с графическим интерфейсом, отказавшись от управления потоками.

Большинство приложений совершенно не ограничено количеством запущенных потоков. Для этих приложений асинхронный ввод-вывод добавляет нулевую пропускную способность, требует дополнительного процессора и усложняет код. Я знаю, потому что измерял пропускную способность и масштабируемость. Я работал над многими приложениями.

В частности, сам IO не становится быстрее. Единственное, что меняется, — это способ инициации и завершения вызова. Здесь нет никакой оптимизации ввода-вывода.

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

Конечно, нет ничего плохого в его использовании, если это правильный инструмент для работы.

person usr    schedule 10.11.2018