2015-07-31 3 views
5

У меня есть виртуальный метод, который иногда содержит вызовы ожидания, а иногда нет. IDE действительно дает мне предупреждение, как правильно обращаться с этим?Async/Await без ожидания вызова

В моем базовом классе:

protected virtual async Task GoNext() 

Из базового класса вызываются через ОЖИДАНИЕ.

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

+5

Непонятный вопрос. 'async' не является частью сигнатуры метода, которая наследуется. Просто не пишите 'async' при объявлении переопределенного метода, который не использует' await'. Вам все равно придется возвращать 'Task' или' Task 'хотя. Вы должны опубликовать некоторый код, который показывает проблему, а также фактическое предупреждение, так что нет никакой путаницы в отношении той конкретной проблемы, с которой вы сталкиваетесь. –

+0

Не можете ли вы опустить асинхронное ключевое слово, если метод не использует ключевое слово ожидания? – Stefan

+1

некоторые примеры того, что вы нашли, должны сделать его лучшим вопросом. –

ответ

8

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

Таким образом, вы можете оставить ключевое слово async по унаследованным методам, если унаследованный метод не использует ключевое слово await.

Обратите внимание, что вы все равно придется возвращать Task или Task<T>, что часть является часть унаследованного метода подписи.

Так что это даст вам предупреждение:

class Base 
{ 
    public virtual async Task<int> Method() 
    { 
     await Task.Delay(10); 
     return 42; 
    } 
} 

class Derived : Base 
{ 
    // next line produces warning 
    public override async Task<int> Method() 
    { 
     return 42; 
    } 
} 

Предупреждение заключается в следующем:

Предупреждение: CS1998 Этот метод асинхронной не хватает «ждать» операторов и будет работать синхронно. Рассмотрите возможность использования оператора await для ожидания неблокирующих вызовов API или await Task.Run(...) для выполнения работы с процессором в фоновом потоке.

Это, однако, не будет производить предупреждение:

class Derived : Base 
{ 
    public override Task<int> Method() 
    { 
     return Task.FromResult(42); 
    } 
} 

Обратите внимание, что я изменил return заявление, в этом последнем методе, так как часть «магии», что async ключевое слово приносит, чтобы автоматически обернуть возвращаемое значение внутри Task<T>. Если у вас есть другие способы получить Task<T>, очевидно, вам не нужно обертывать результат, как я сделал выше.

Смежные вопросы