Должен ли я беспокоиться о" этом асинхронном методе не хватает операторов "await" и будет работать синхронно " предупреждение

У меня есть интерфейс, который предоставляет некоторые асинхронные методы. Более конкретно, он имеет определенные методы, которые возвращают либо Task, либо Task. Я использую ключевые слова async/await.

Я нахожусь в процессе реализации этого интерфейса. Однако в некоторых из этих методов этой реализации нечего ждать. По этой причине я получаю предупреждение компилятора "этот асинхронный метод не имеет операторов "await" и будет работать синхронно..."

Я понимаю, почему я получение ошибки, но мне интересно, должен ли я что-нибудь сделать с ними в этом контексте. Неправильно игнорировать предупреждения компилятора.

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

должен ли я просто игнорировать предупреждения или есть способ обойти это, который я не вижу?

2 ответов


на асинхронные ключевое слово-это просто деталь реализации метода; это не часть подписи метода. Если одной конкретной реализации метода или переопределению нечего ждать, просто опустите асинхронные ключевое слово и возврат выполненной задачи с помощью задач.FromResult:

public Task<string> Foo()               //    public async Task<string> Foo()
{                                       //    {
    Baz();                              //        Baz();
    return Task.FromResult("Hello");    //        return "Hello";
}                                       //    }

если ваш метод возвращает задание вместо Задача , затем вы можете вернуть выполненную задачу любого типа и ценность. Task.FromResult(0) кажется, популярный выбор:

public Task Bar()                       //    public async Task Bar()
{                                       //    {
    Baz();                              //        Baz();
    return Task.FromResult(0);          //
}                                       //    }

или, начиная с .NET Framework 4.6, вы можете вернуть задач.CompletedTask:

public Task Bar()                       //    public async Task Bar()
{                                       //    {
    Baz();                              //        Baz();
    return Task.CompletedTask;          //
}                                       //    }

вполне разумно, что некоторые "асинхронные" операции выполняются синхронно, но все же соответствуют модели асинхронного вызова ради полиморфизма.

реальный пример этого - с API ввода-вывода ОС. Асинхронные и перекрывающиеся вызовы на некоторых устройствах всегда завершаются inline (например, запись в канал, реализованный с использованием общей памяти). Но они реализуют тот же интерфейс, что и многосоставные операции, которые продолжаются в фоновом режиме.