为什么CS4014没有显示所有返回任务的函数?

时间:2017-08-10 12:50:29

标签: c# async-await

假设以下代码:

private async Task Test1Async() => await Task.Delay(1000).ConfigureAwait(false);
private Task Test2Async() => Test1Async();

从功能上讲,这些函数完全相同,但编译器会将调用这些方法视为不同。以下代码编译,但发出CS4014警告:

private void Test() => Test1Async();   // CS4014 is shown

它生成警告" 因为没有等待此调用,当前方法在呼叫完成之前继续运行"。这是一个正确的警告,因为它通常表示代码中存在缺陷。如果您确实需要此行为,则可以使用以下代码解决此问题:

private void Test() => _ = Test1Async();   // CS4014 is not shown anymore

将值分配给_是一个相对较新的功能,用于指示有意忽略该值。

此代码不会引发CS4014:

private void Test() => Test2Async();   // CS4014 is not shown!

当然,我可以重写我的所有方法来使用async/await方法,但这会导致更多代码运行效率降低(由于async关键字生成的状态机)。也许我永远不会忘记它,但我的同事可能然后我不会得到触发器(或者我称之为不使用异步的第三方库)。

关于返回的Task使用情况的警告也有所不同。

有谁知道为什么没有为返回Task不使用async关键字的方法生成此警告?

2 个答案:

答案 0 :(得分:4)

  

有谁知道为什么没有为返回Task不使用async关键字的方法生成此警告?

可能会避免遗留代码的虚假警告。 Task早于async,并且有许多方法可以返回Task但与异步代码无关。

就我个人而言,我认为忽略Task返回值几乎肯定是一个错误,即使在非异步代码中也是如此。但我认为MS团队运行指标并确定这种警告对于那些类型的代码库来说太吵了。

答案 1 :(得分:1)

未发出警告,因为地板上没有Task。正在返回Task,因此调用者完全能够观察它。存在警告以指出未被观察到的任务。产生警告会是错误

代码是正确的;产生正确的代码的警告是非常有问题的,因为它可能导致程序员将其更改为错误的代码,更糟糕的代码,关于问题是什么的混淆(因为没有一个)或者,至少,他们需要花费额外的工作来解决一个糟糕的警告。