子类无需父类异步virtual Task方法逻辑,如何优雅重写?
重写异步virtual方法的优雅实现方式
你有一个包含异步virtual方法的抽象类,代码如下:
public virtual async Task Response(CancellationToken cancellationToken) { // 原有逻辑 }
子类中不需要保留该方法的原有逻辑,目前的重写方式存在不必要的状态机开销,这里有两种更优雅且高效的实现方式:
方式一:直接返回已完成任务
去掉async关键字,直接返回Task.CompletedTask,避免async/await生成额外的状态机,减少性能损耗:public override Task Response(CancellationToken cancellationToken) { return Task.CompletedTask; }方式二:支持取消令牌的规范实现
如果需要遵循异步方法的取消约定,在方法开头检查取消令牌,确保调用方发起取消时能正确抛出异常:public override Task Response(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); return Task.CompletedTask; }
如果父类的异步方法是带返回值的Task<T>类型,只需将返回值替换为Task.FromResult(default(T))即可,比如返回字符串类型时可以写return Task.FromResult(string.Empty);。
内容的提问来源于stack exchange,提问作者TryHard
相关产品推荐
相关产品推荐

