具有异步覆盖的同步基础方法

时间:2019-01-15 14:45:53

标签: c# visual-studio

我有一个基类,其子代可能要实现一个方法  异步地。 我已经实现了以下内容,但是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 :(得分:7)

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

由于您的方法无法执行任何可以等待的操作,因此可以使用Task.FromResult方法返回已经完成的Task。

您不需要等待GetEntityName内部的任何内容,因为不会等待任何不完整的任务。

答案 1 :(得分:4)

async是其出现的特定方法的实现细节。无论出现什么地方,它都构成方法签名的一部分。 (这也是为什么不允许在接口 1 中使用async的原因-因为它们没有实现,并且不属于方法签名)。

这就是说,任何虚拟Task返回方法在子类中可能有override实现,这些子类不使用/不使用async,这与原始基础方法的使用方式无关标记为其中一个。

As FCin shows,很有可能让同步方法仍返回您想要的Task作为方法的返回类型。


1 忽略接口的新型默认实现。