C# “CS1998”背后的原因是什么;方法缺少等待运算符“;

C# “CS1998”背后的原因是什么;方法缺少等待运算符“;,c#,asynchronous,async-await,C#,Asynchronous,Async Await,当async方法缺少任何wait运算符时,C#编译器会生成CS1998警告 警告背后的原因是什么 我知道async通过添加状态机和异常处理在方法中引入了开销 警告性能的主要原因是什么? 或者是通知我可能忘记在某处等待的原因 也许语言设计团队的人可以为这一点提供一些启示…:) (请:不要发布“您可以删除async以消除警告”的答案。我想知道警告背后的原因和决定,而不是解决方法。) 警告背后的原因是什么 简单地说,一个不使用await的async方法几乎肯定是错误的。并非总是错误的,否则这将是一个错

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

警告背后的原因是什么

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

警告性能的主要原因是什么? 或者是通知我可能忘记在某处等待的原因

也许语言设计团队的人可以为这一点提供一些启示…:)

(请:不要发布“您可以删除
async
以消除警告”的答案。我想知道警告背后的原因和决定,而不是解决方法。)

警告背后的原因是什么

简单地说,一个不使用
await
async
方法几乎肯定是错误的。并非总是错误的,否则这将是一个错误。但几乎总是错的,因此发出了警告

一个非常常见的异步新手错误是假设
async
意味着“使此方法异步”。这通常与“异步”意味着“在后台线程上运行”的假设相结合,但有时这只是一种“神奇”的假设

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

我还发现这个警告在重构我自己的代码时很有用——有时我会使用一个
async
方法,该方法应该改为同步方法,这个警告指出了这一点


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

如果一个方法中没有任何
wait
s,那么它是
async
没有多大意义。我不是一个语言设计师,但新程序员的一个明显错误的假设是,标记为
async
的方法以某种方式异步执行。如果任何地方都没有
wait
操作符,这显然是不正确的。“这并没有达到您的预期,而且有更好的方法来编写您试图实现的内容”显然是编译器警告的候选情况。@juharr,当被调用方是
async
@juharr时,它会改变调用方的异常行为。原因之一是:
任务
没有协方差,因此,如果您使用
Task.FromResult()
返回某些内容,则可能必须手动指定泛型类型,而不是进行类型推断(如果您的方法返回传递给
Task.FromResult()
的值的超类)。如果您必须实现一个方法签名,比如
Task MyMethod()
,那么编写
async Task MyMethod(){DoSomething();}
Task MyMethod(){DoSomething();return Task.CompletedTask;}
@jeroemostert这不就是“新程序员”的问题吗他们不明白这些东西是怎么工作的?为什么“另一种方式”更好?您提到的异常处理案例正是我目前面临的情况。我想忽略这个警告,但不确定这是否是个好主意。有了你的回答,我觉得在某些情况下压制警告是可以的。谢谢你的帮助!我想说,能够避免
返回Task.CompletedTask的“极小用例”
或需要手动指定
TResult
的场景,因为在使用
Task MyMethodAsync()=>Task.FromResult(subclass值)时,类型推断选择了方法返回类型的子类(编译错误,无法将
任务
转换为
任务
)超过此警告的任何好处。我自己通过CS1998禁用了这个警告…我刚刚遇到了一个棘手的错误,我在应该返回任务的地方返回了null。异步方法没有问题,但在其他方面非常糟糕。我有所有的异步签名(带有虚拟方法),但不是基类中的所有方法都需要它。为了避免警告,我和那种混血儿生活在一起。直到现在。我要放弃那个警告。我现在知道我在做什么了。到底为什么编译器要向“异步新手”解释一些东西?我认为应该简单地检查代码并编译它。就这样。还有一个短语“简单地说,不使用wait的异步方法几乎肯定是错误的”,没有解释。只是一句话,连一个例子都没有。那些“错误”的案例是什么?我仍然不明白这个警告为什么有用。@VictorYarema:最好的错误消息是那些可操作的消息。因此,近年来,编译器试图将错误消息做得更好,而不是让开发者用谷歌搜索。情况并非总是如此;在90年代后期,我实际上建立了一个C++错误文档,“这就是这个意思”。关于不带wait的
async
,通常错误的原因是
async
关键字的主要目的是启用
wait
关键字: