7

我有这行代码:

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

...关于编译器有这样的说法:

警告 2 由于不等待此调用,因此在调用完成之前继续执行当前方法。考虑将“等待”运算符应用于调用结果。

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

4

1 回答 1

9

我为什么要这样做await

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

在正常的同步代码中,您不必做任何特殊的事情来等待您调用的方法完成,每个方法调用总是阻塞。await但是对于异步方法,如果您想等到它们完成,您实际上必须使用它们。此外,如果异步操作失败并引发异常,则在获得方法的结果之前您不会知道它await(或以其他方式从结果中获取异常,例如Wait()如果 awaitable 为 a 则调用Task)。

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

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

于 2012-09-23T00:16:45.200 回答