Async / Await没有等待呼叫

时间:2015-07-31 09:09:54

标签: c# async-await

我有一个虚拟方法,有时包含等待调用,有时不包含。 IDE确实给了我警告,处理这个问题的正确方法是什么?

在我的基类中:

protected virtual async Task GoNext ()

从基类中通过await调用它。

然后在我的子类中,我重写了这个方法,但有时候它确实包括await和它没有的时间。

1 个答案:

答案 0 :(得分:11)

strip()关键字实际上不是继承方法签名的一部分,而是编译器需要根据异步方法的模式编译和重写方法的更多信号。

因此,如果继承的方法不使用async关键字,则可以在继承的方法上省略async关键字。

请注意,您仍然必须返回awaitTask 部分是继承方法签名的一部分。

所以这会给你一个警告:

Task<T>

警告是这样的:

  

警告:CS1998此异步方法缺少等待&#39;运营商并将同步运行。考虑使用class Base { public virtual async Task<int> Method() { await Task.Delay(10); return 42; } } class Derived : Base { // next line produces warning public override async Task<int> Method() { return 42; } } 运算符等待非阻塞API调用,或await在后​​台线程上执行CPU绑定工作。

然而,这不会产生警告:

await Task.Run(...)

请注意,我在最后一个方法中更改了class Derived : Base { public override Task<int> Method() { return Task.FromResult(42); } } 语句,因为&#34; magic&#34; return关键字带来的是自动将返回值包装在async内。如果你有其他方法可以获得Task<T>,显然你不需要像上面那样包装结果。