当async
方法缺少任何await
运算符时,C#编译器会生成CS1998警告。
警告背后的原因是什么?
我知道async
通过添加状态机和异常处理在方法中引入了开销。
警告性能的主要原因是什么?
或者是否有理由通知我,我可能忘记了await
某个地方?
也许来自语言设计团队的人可以对这一点有所了解...... :)。
(请:不要发帖说'你可以删除async
以使警告消失'。我想知道警告背后的原因和决定,而不是解决问题的方法。)< / p>
答案 0 :(得分:9)
警告背后的原因是什么?
简单地说,一个不使用async
的{{1}}方法几乎肯定是错误的。不总是错误,否则这将是一个错误。但几乎总是错误的,因此警告。
一个非常常见的异步 - 新手错误是假设await
意味着&#34;使这个方法异步&#34;。这通常与假设&#34;异步&#34;意味着&#34;在后台线程上运行&#34;,但有时它只是假设&#34;魔术&#34;。
因此,警告明确指出代码将同步运行。
我在重构自己的代码时也发现这个警告很有用 - 有时候我最终会得到一个async
方法,应该改为同步方法,这个警告指出了这一点。
如果你有非平凡的(即可能是异常生成的)同步代码并且你需要实现异步,那么async
没有async
对于减少代码是有用的方法签名。在这种情况下,您可以使用await
来避免六行async
和TaskCompletionSource<T>
/ try
代码。但这是一个非常小的用例;在绝大多数情况下,警告是有帮助的。