如果我返回异步方法的return参数,是否需要添加async await?

时间:2017-03-30 13:48:42

标签: c# asynchronous

如果我有一个继承基类的类,并且这两个类都继承了这个接口

public interface BaseClass
{
    Task<object> GetAsync();
}

如果基类将其方法实现为:

public async Task<object> GetAsync()
{
    object o = async DoSomethingAsync();
    return o;
}

继承基类的类会覆盖该方法,但仍会调用基类方法,如果你把async等待了,这有关系吗? e.g?

// Option 1
public async Task<object> GetAsync()
{
    DoSomethingElse();
    return await base.GetAsync();
}

// Option 2
public Task<object> GetAsync()
{
    DoSomethingElse();
    return base.GetAsync();
}

两者有什么区别?有没有?

2 个答案:

答案 0 :(得分:-1)

调用基类方法与在这方面从不同类调用方法没什么不同,你仍然应该添加'await'。没有它,你的派生方法将同步执行。

答案 1 :(得分:-1)

尽管它似乎是签名的一部分,但async实际上是它装饰 1 的方法的实现细节。没有必要用async来装饰方法,因为它覆盖了使用它实现 的方法。

选项2没问题。

有一个github issue与将选项1自动重写为选项2有关,但我不确定是否/何时会到达,因为有一些反对它的论据(特别是在例外的情况下) )

1 作为进一步的证据表明它不是签名的一部分,在定义界面成员时甚至不允许使用async