C# 为什么使用ContinueWith时会收到编译器警告?

C# 为什么使用ContinueWith时会收到编译器警告?,c#,.net-4.5,compiler-warnings,async-await,C#,.net 4.5,Compiler Warnings,Async Await,我有一行代码: t.ContinueWith(_ => form.Close(), TaskScheduler.FromCurrentSynchronizationContext()); …编译器对此有这样的说法: 警告2由于未等待此调用,因此在调用完成之前将继续执行当前方法。考虑将“Acess”运算符应用到调用的结果。< /P> 现在,这不是我写的代码,但我认为它只是在现有任务的末尾添加一个延续。我不认为它实际上正在运行任务(或继续)。那么,仅仅修

我有一行代码:

t.ContinueWith(_ => form.Close(), 
                  TaskScheduler.FromCurrentSynchronizationContext());
…编译器对此有这样的说法:

警告2由于未等待此调用,因此在调用完成之前将继续执行当前方法。考虑将“Acess”运算符应用到调用的结果。< /P> 现在,这不是我写的代码,但我认为它只是在现有任务的末尾添加一个延续。我不认为它实际上正在运行任务(或继续)。那么,仅仅修改任务的过程肯定是一个同步操作吗?为什么我要等待它

为什么我要等待它

你不必等待它,这就是为什么它是一个警告,而不是一个错误。但是,如果您使用的是
async
方法,并且您有一个返回等待对象的方法,那么在大多数情况下,您不应该忽略它

在普通的同步代码中,您不必做任何特殊的事情来等待调用的方法完成,每个方法调用都会阻塞。但对于异步方法,如果您想等待它们完成,实际上必须等待它们。此外,如果异步操作失败并引发异常,则只有等待方法的结果(或者以其他方式从结果中获取异常,例如调用
Wait()
,如果等待的是
任务,则调用
Wait()
),您才会知道该异常

因此,如果忽略
async
方法中返回的等待值,则很可能代码中存在错误,这正是警告试图避免的


在您的情况下,
ContinueWith()
返回一个
任务
,该任务可以
等待
执行,因此编译器假定您应该
等待它。但是在这种情况下,您不希望等到继续操作完成,并且
Close()
很可能不会引发异常。因此,在这种情况下,警告是假阳性,它实际上并不表示代码中存在问题。

您可以发布整个方法吗?Stephen,这是您的代码:-)在没有周围代码的情况下,我不确定,但为什么不等待t然后形成。关闭?上面的链接中提供了周围代码(上面有2条注释)。任务t已经在进行中,周围代码的要点是在t执行时显示一个进度对话框,因此
wait
-ing t在这里是不合适的。这将教会我在不编译代码的情况下发布代码!:)回答得很好,谢谢。我能做些什么来阻止警告出现,从而掩盖所有实际问题?(我不想在其他情况下禁用警告,就在这里)。如果在方法之前添加
#pragma warning disable 4014
,然后在方法之后添加
#pragma warning restore 4014
,则可以仅为该方法禁用它。通常,我会建议您修复警告所抱怨的内容,但在这种情况下,实际上没有什么需要修复的,因此,我认为仅为这种方法禁用警告是有意义的。另一种选择是将任务分配给变量。然后忽略变量。谢谢@svick。如果这个警告号码出现在该死的警告信息里,那不是很好吗?这样我就不用浪费10分钟去追踪它了?