【问题标题】:Αsync for overridden method when virtual method isn't async当虚拟方法不是异步时,覆盖方法的 Αsync
【发布时间】:2022-02-14 19:21:19
【问题描述】:

我在 C# 中有一个带有虚方法的类,例如:

public class Car
{
    public virtual CarModel Run()
    {
        return new CarModel();
    }
}

第二类继承自Car类:

public class CarFiat : Car
{
    public async override Task<CarModel> Run()
    {
        var carModel = base.Run();

        await MeasureSpeed();

        return carModel;
    }

    private async Task<string> MeasureSpeed()
    {
        return await Task.FromResult("50");
    }
}

现在我得到错误:Return type must be CarModel to match overridden member Car.Run() 当我从 RunCarFiat 类中删除 await, asyncTask 时,它可以工作,但我不能在其中调用异步方法:

//public async override Task<CarModel> Run()
public override CarModel Run()
{
    var carModel = base.Run();

    //await MeasureSpeed();

    return carModel;
}

【问题讨论】:

  • 不可能做到正确。你能改变基类吗?你可以在那里返回Task.FromResult(new CarModel());
  • 看起来CarFiat.Run 不需要与您发布的代码异步。
  • 为什么你的 MeasureSpeed 方法是异步的,因为它只有真的行为同步?
  • 我只发布了示例,我的逻辑要复杂得多。我的真实示例覆盖方法向 no-sql 数据库发出异步请求并且必须异步,基本虚拟方法没有

标签: c# inheritance async-await overriding


【解决方案1】:

您必须修改您的基类以返回Task&lt;CarModel&gt;。然后您可以使用Task.FromResult 在您的基地同步返回。

public class Car
{
    public virtual Task<CarModel> Run()
    {
        return Task.FromResult(new CarModel());
    }
}

如果上述方法不可行,您可以通过异步进行同步,但它推荐https://stackoverflow.com/a/9343733/1020941

【讨论】:

    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2012-06-19
    • 2011-05-21
    • 2014-03-18
    • 1970-01-01
    • 2020-08-31
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多