等待不期待的基类的覆盖

时间:2015-11-27 09:13:33

标签: c# .net wpf asynchronous async-await

我需要编写一个虚拟基类。

public virtual int LoadData()
{
    return 0;
}

并且需要使用await调用来编写覆盖。

public override async Task<int> LoadData()
{
    await Task.Delay(200)
    return 1;
}

如何实施?

2 个答案:

答案 0 :(得分:4)

在您的基类中,您只需实现LoadDataAsync方法:

public virtual int LoadData()
{
    return 0;
}

public async Task<int> LoadDataAsync()
{
    return await Task.Run(() => LoadData());
}

这使您可以自由地覆盖继承类中的LoadData方法,而无需实现异步方法。

public override int LoadData()
{
    return 69;
}

答案 1 :(得分:3)

简直不可能。当您要覆盖方法时,子方法应具有确切的名称,参数类型(和顺序)以及返回类型作为父方法。虽然,你想要做的是覆盖int LoadData() Task<int> LoadData(),这是完全错误的(无论async关键字在这里无关),因为你有两种不同的返回类型。因此,如果您可以访问父代的源代码,则必须更改您的设计。例如,可能的设计之一可能是这样的:

// parent:
public virtual Task<int> LoadData()
{
    return Task.FromResult(0);
}

// child
public override async Task<int> LoadData()
{
    await Task.Delay(200)
    return 1;
}

或者这个:

// parent:
public virtual int LoadData()
{
    return 0;
}
public virtual Task<int> LoadDataAsync()
{
    return Task.Run(() => LoadData());
    // or implement it awaitable; whatever you need, there is no difference.
}

// child
public override int LoadData()
{
    return 0;
}
public override async Task<int> LoadDataAsync()
{
    await Task.Delay(200); // or don't await it; just return the Task. whatever is your requirement.
    return 1;
}