为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
手掌心 2022-07-23 16:17:39
我有一个基类,它的子类可能想要异步实现一个方法。我已经实现如下,但是 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 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

public abstract class BaseHandler

{

    protected virtual Task<string> GetEntityName(object entity)

    {

        return Task.FromResult(string.Empty);

    }

}

因为你的方法没有做任何可以等待的事情,你可以通过使用Task.FromResult方法返回已经完成的任务。


你不需要 await 里面的任何东西GetEntityName,因为没有任何不完整的 Task 需要等待。


查看完整回答
反对 回复 2022-07-23
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

async是它出现的特定方法的实现细节。尽管它出现在哪里,它并不构成方法签名的一部分。async(这也是接口1中不允许您使用的原因——因为它们没有实现,而且它不是方法签名的一部分)。

也就是说,任何虚拟Task返回方法都可能override在子类中具有/不使用的实现,async并且原始基方法的标记方式也无关紧要。

正如 FCin 所示,完全有可能有一个同步方法仍然返回Task您想要的作为该方法的返回类型。


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


查看完整回答
反对 回复 2022-07-23
  • 2 回答
  • 0 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信