Подавить предупреждение от пустого асинхронного метода
Позвольте просто сказать, что у меня есть следующая функция:
public class Test
{
public async Task Finalize()
{
// We don't need this in this class, so empty body
}
/*
* Additional methods snipped
*/
}
Пока это работает отлично, я получу предупреждение о компиляторе:
В этом асинхронном методе отсутствуют операторы "ждут" и будут выполняться синхронно. Подумайте о том, как использовать оператор "ожидание" для ожидания неблокирующих вызовов API или "ждать Task.Run(...)", чтобы выполнять работу с привязкой к процессору в фоновом потоке.
Каким будет лучший способ обойти это предупреждение, не слишком сильно изменив метод? В этом случае я не могу исключить исключение, так как метод будет вызван, но абсолютно ничего не произойдет в этот момент, так как класс, о котором я говорю, не имеет ничего для завершения.
Ответы
Ответ 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
}
}