2012-09-22 34 views
7

我有这行代码:为什么使用ContinueWith时会出现编译器警告?

t.ContinueWith(_ => form.Close(), 
        TaskScheduler.FromCurrentSynchronizationContext()); 

...哪个编译器有这样一段话:

警告2由于这个呼叫没有等待,目前的方法执行之前继续通话完成。考虑将“await”运算符应用于调用的结果。

现在,这不是我写的代码,但我认为它只是在现有任务的末尾添加延续。我没有想到它实际上是运行的任务(或延续)。所以这个只修改任务的过程肯定是同步操作?我为什么要去await呢?

+0

Can I Haz Suround Coud? –

+0

你可以发布整个方法吗? –

+1

斯蒂芬,这是你的代码:-)见http://stackoverflow.com/a/12513296/98422 –

回答

8

为什么我要await呢?

你不需要await它,这就是为什么它是一个警告,而不是一个错误。但是,如果您使用的方法是async,并且您有一个返回等待对象的方法,则大多数时候您不应该忽略它。

在正常的同步代码中,你不必做任何特殊的事情来等待你调用的方法完成,每个方法调用总是阻塞。但是对于异步方法,如果你想等到它们完成,你实际上需要await。另外,如果异步操作失败并抛出一个异常,那么直到你方法的结果(或者从其他方式得到结果的异常,如调用Wait()如果可等候的是Task),你将不会知道它。 。

因此,如果您在async方法中忽略了返回的适合值,那么您的代码中可能存在一个错误,这是警告尝试避免的错误。

在你的情况,ContinueWith()返回Task,这可以await版,所以编译器假定您应该await它。但在这种情况下,您不希望等到继续完成并且最有可能不会抛出异常。因此,在这种情况下,警告是误报,它实际上并不代表代码中存在问题。

+0

很好的答案,谢谢。有什么我可以做的,以阻止警告出现,从而模糊所有的_actual_问题? (我不想在其他情况下禁用警告,只是在这里)。 –

+3

如果您在方法之前添加'#pragma警告禁用4014'并且之后添加'#pragma warning restore 4014',您可以仅为此方法禁用它。通常情况下,我会建议您解决警告所抱怨的内容,但在这种情况下,没有什么可修复的,因此禁用仅用于此方法的警告是有道理的,我认为。 – svick

+1

另一种选择是将任务分配给一个变量。然后简单地忽略该变量。 – wasabi

相关问题