Синхронный базовый метод с асинхронным переопределением - PullRequest
0 голосов
/ 15 января 2019

У меня есть базовый класс, чьи дети могут захотеть реализовать метод асинхронно. Я реализовал, как показано ниже, однако Visual Studio предлагает сделать GetEntityName в базе синхронной, потому что она ничего не делает await. Это, однако, сломало бы детей.

Есть ли лучший способ?

  public abstract class BaseHandler
  {
        protected virtual async Task<string> GetEntityName(object entity)
        {
            return string.Empty;
        }
  }



 public class ChilldHandler: BaseHandler
 {
        protected override async Task<string> GetEntityName(object entity)
        {
            return await LongRunningService.DoSomething(entity);
        }
 }

Ответы [ 2 ]

0 голосов
/ 15 января 2019

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

То есть любой виртуальный метод возврата Task может иметь реализации override в дочерних классах, которые не используют / не используют async, и не имеет значения, как был помечен исходный базовый метод.

Как показывает FCin , вполне возможно, что синхронный метод будет по-прежнему возвращать Task, который вы хотите использовать в качестве возвращаемого типа для метода.


1 Игнорирование новомодных реализаций по умолчанию для интерфейсов.

0 голосов
/ 15 января 2019
public abstract class BaseHandler
{
    protected virtual Task<string> GetEntityName(object entity)
    {
        return Task.FromResult(string.Empty);
    }
}

Поскольку ваш метод не делает ничего, что можно ожидать, вы можете вернуть уже завершенную задачу, используя метод Task.FromResult.

Вам не нужно ничего ждать внутри GetEntityName, потому что нет ожидающих выполнения незавершенных задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...