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

lon*_*ero 3 .net abstract-class asynchronous c#-5.0

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

public class MyAbtractDoerClass
{
    public abstract Task DoItAsync();
}
Run Code Online (Sandbox Code Playgroud)

它还有一些派生类PainterClass和EraserClass:

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

public class EraserClass : MyAbtractDoerClass
{
    public override async Task DoItAsync();
}
Run Code Online (Sandbox Code Playgroud)

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

public MyAbstractClass Factory(string doerType)
Run Code Online (Sandbox Code Playgroud)

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

var doer = Factory("painter");
await doer.DoItAsync();  // <--- here is the problem.
Run Code Online (Sandbox Code Playgroud)

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

我的代码出了什么问题?

更新

这是我在VS中遇到的错误: 在此输入图像描述

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

在此输入图像描述

Ste*_*ary 9

你当然可以这样做:

await doer.DoItAsync();
Run Code Online (Sandbox Code Playgroud)

理解的关键是类型是等待的,而不是方法.你可以这样做await doer.DoItAsync(),因为DoItAsync回报Task,而不是因为DoItAsyncasync.我在我的async介绍帖中解释了这一点.

换句话说,该代码与以下内容完全相同:

Task temp = doer.DoItAsync();
await temp;
Run Code Online (Sandbox Code Playgroud)

我的博客上有一个" asyncOOP"系列 ; 其中一个帖子涵盖async了继承方案.

  • 你只需要调用**调用**方法`async`. (4认同)