我有一个基类,其子代可能要实现一个方法
异步地。
我已经实现了以下内容,但是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);
}
}
答案 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 忽略接口的新型默认实现。