API设计中的异步抽象方法和派生类

时间:2014-04-28 22:40:05

标签: .net asynchronous abstract-class c#-5.0

我有一个抽象类 MyAbstractDoerClass,它有一个名为DoItAsync的抽象方法,如下所示:

public class MyAbtractDoerClass
{
    public abstract Task DoItAsync();
}

它还有几个派生类PainterClass和EraserClass:

public class PainterClass : MyAbtractDoerClass
{
    public override async Task DoItAsync();
}

public class EraserClass : MyAbtractDoerClass
{
    public override async Task DoItAsync();
}

最后,有一个Factory方法返回这两个类中任何一个的实例。签名是这样的:

public MyAbstractClass Factory(string doerType)

现在,我的代码如下所示:

var doer = Factory("painter");
await doer.DoItAsync();  // <--- here is the problem.

鉴于MyAbstractClass.DoItAsync方法是一个抽象方法,它不能被标记为异步,因此我不能在API客户端中使用await关键字。这使我的API可用性看起来非常糟糕。我怀疑我的设计有些不对劲,有些概念我并不完全理解,但我不知道是什么。

我的代码出了什么问题?

更新

这是我在VS中遇到的错误: enter image description here

这是抽象类中方法的签名:

enter image description here

1 个答案:

答案 0 :(得分:9)

你当然可以这样做:

await doer.DoItAsync();

理解的关键是类型是等待的,而不是方法。您可以执行await doer.DoItAsync(),因为DoItAsync会返回Task,而不是因为DoItAsyncasync。我在async intro post中解释了这一点。

换句话说,该代码完全相同:

Task temp = doer.DoItAsync();
await temp;

我的博客上有"async OOP" series;其中一个帖子涵盖async in inheritance scenarios