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

Gar*_*ill 7 c# compiler-warnings async-await .net-4.5

我有这行代码:

t.ContinueWith(_ => form.Close(), 
                  TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)

...关于编译器有什么要说的:

警告2由于未等待此调用,因此在完成调用之前将继续执行当前方法.考虑将'await'运算符应用于调用的结果.

现在,这不是我写的代码,但我认为它只是在现有任务结束时添加一个延续.我认为它实际上并没有运行任务(或延续).那么仅仅修改任务的过程肯定是同步操作吗?我为什么要await这么做?

svi*_*ick 9

我为什么要await这么做?

你没有await它,这就是为什么它是一个警告,而不是一个错误.但是,如果你在一个async方法中并且你有一个返回一个等待对象的方法,那么大多数时候你不应该忽略它.

在普通的同步代码中,您不必执行任何特殊操作即可等待您调用的方法完成,每个方法调用始终会阻塞.但是使用异步方法,await如果你想等到它们完成,你实际上必须使用它们.此外,如果异步操作失败并抛出异常,则在您await获取方法的结果之前您将不会知道它(或者以其他方式从结果中获取异常,例如,Wait()如果awaable是a则调用Task).

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

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

  • 如果在方法之前添加`#pragma warning disable 4014`并在之后添加`#pragma warning restore 4014`,则可以仅针对此方法禁用它.通常,我会建议你修复警告所抱怨的内容,但在这种情况下,实际上没有什么可以解决的,所以我认为禁用这种方法的警告是有道理的. (3认同)