猿问

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

我有一个基类,它的子类可能想要异步实现一个方法。我已经实现如下,但是 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);

        }

 }


手掌心
浏览 93回答 2
2回答

繁华开满天机

public abstract class BaseHandler{&nbsp; &nbsp; protected virtual Task<string> GetEntityName(object entity)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return Task.FromResult(string.Empty);&nbsp; &nbsp; }}因为你的方法没有做任何可以等待的事情,你可以通过使用Task.FromResult方法返回已经完成的任务。你不需要 await 里面的任何东西GetEntityName,因为没有任何不完整的 Task 需要等待。

至尊宝的传说

async是它出现的特定方法的实现细节。尽管它出现在哪里,它并不构成方法签名的一部分。async(这也是接口1中不允许您使用的原因——因为它们没有实现,而且它不是方法签名的一部分)。也就是说,任何虚拟Task返回方法都可能override在子类中具有/不使用的实现,async并且原始基方法的标记方式也无关紧要。正如 FCin 所示,完全有可能有一个同步方法仍然返回Task您想要的作为该方法的返回类型。1忽略接口的新奇默认实现。
随时随地看视频慕课网APP
我要回答