Подтвердить что ты не робот

Подавить предупреждение от пустого асинхронного метода

Позвольте просто сказать, что у меня есть следующая функция:

public class Test
{
    public async Task Finalize()
    {
        // We don't need this in this class, so empty body
    }

    /*
     * Additional methods snipped
     */
}

Пока это работает отлично, я получу предупреждение о компиляторе:

В этом асинхронном методе отсутствуют операторы "ждут" и будут выполняться синхронно. Подумайте о том, как использовать оператор "ожидание" для ожидания неблокирующих вызовов API или "ждать Task.Run(...)", чтобы выполнять работу с привязкой к процессору в фоновом потоке.

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

4b9b3361

Ответ 1

Вы можете поместить следующую директиву в файл (ы):

#pragma warning disable 1998

Однако я бы рекомендовал оставить предупреждение в одиночку и принять его совет. Это предупреждение по уважительной причине;)

EDIT: если вы хотите отключить предупреждение только для одного метода, вы можете сделать это:

#pragma warning disable 1998
async Task Foo() {}
#pragma warning restore 1998

Ответ 2

Этот способ предотвратит предупреждение компилятора вместо его отключения:

Для любого, кто интересуется, если вам когда-либо понадобится обойти предупреждение о компиляторе:

public async Task DoStuff
{
    // This method should stay empty
    // Following statement will prevent a compiler warning:
    await Task.FromResult(0);
}

Ответ 3

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

Вы можете реализовать метод Task -returning без ключевого слова async, просто вернув завершенный Task, как таковой:

public Task FinalizeAsync()
{
  return Task.FromResult(0);
}

Однако это все равно выделяет Task каждый раз, когда он вызывает. Если вы обнаружите, что делаете это много, вам может понадобиться кэшировать завершенный экземпляр Task. Для этой цели моя библиотека AsyncEx предоставляет ряд констант задач:

public Task FinalizeAsync()
{
  return TaskConstants.Completed;
}

Наконец, вы можете захотеть взглянуть на мой пост в блоге асинхронного удаления для нескольких альтернативных подходов.

Ответ 4

до .Net 4.6 нам приходилось возвращать фиктивное значение, которое нам не нужно. Однако теперь мы можем сделать это так:

public async Task MyFunctionAsync()
{
    // Some works here...
    await Task.CompletedTask;
}

Ответ 5

Удалите "async", и предупреждение исчезнет:

public class Test
{
    public void Finalize()
    {
        // We don't need this in this class, so empty body
    }
 }