CS1998“方法缺乏等待运营商”背后的原因是什么?

时间:2016-06-02 14:28:47

标签: c# asynchronous async-await

async方法缺少任何await运算符时,C#编译器会生成CS1998警告。

警告背后的原因是什么?

我知道async通过添加状态机和异常处理在方法中引入了开销。

警告性能的主要原因是什么? 或者是否有理由通知我,我可能忘记了await某个地方?

也许来自语言设计团队的人可以对这一点有所了解...... :)。

(请:不要发帖说'你可以删除async以使警告消失'。我想知道警告背后的原因和决定,而不是解决问题的方法。)< / p>

1 个答案:

答案 0 :(得分:9)

  

警告背后的原因是什么?

简单地说,一个不使用async的{​​{1}}方法几乎肯定是错误的。不总是错误,否则这将是一个错误。但几乎总是错误的,因此警告。

一个非常常见的异步 - 新手错误是假设await意味着&#34;使这个方法异步&#34;。这通常与假设&#34;异步&#34;意味着&#34;在后台线程上运行&#34;,但有时它只是假设&#34;魔术&#34;。

因此,警告明确指出代码将同步运行

我在重构自己的代码时也发现这个警告很有用 - 有时候我最终会得到一个async方法,应该改为同步方法,这个警告指出了这一点。

如果你有非平凡的(即可能是异常生成的)同步代码并且你需要实现异步,那么async没有async对于减少代码是有用的方法签名。在这种情况下,您可以使用await来避免六行asyncTaskCompletionSource<T> / try代码。但这是一个非常小的用例;在绝大多数情况下,警告是有帮助的。