如果在调用方被释放之前,一个await调用没有完成会发生什么?

3

想象一种场景,你拥有某种控制形式。它可以是 WP8 上的页面或 WinForms 中的表单,我认为这并不重要(或者说是吗?)。在某个时刻,你调用一个方法并使用 await,但是很快用户关闭了控件。

等待中的任务会发生什么?它是否继续执行?如果它返回,它会返回到哪里?如果它被取消,是否会抛出异常?

最后,有没有一种方法可以指定您希望执行继续/完成?


1
“调用者”是一个方法,而不是一个对象,因此我认为把它看作被处理掉是没有意义的。(从技术上讲,该方法被转换为一个类,但即使这样,也不是被处理掉的内容。) - user743382
1个回答

4
任务继续执行。这是因为运行代码只能通过合作方式中止(不考虑邪恶的Thread.Abort)。
任务对其环境一无所知。等待程序会被通知完成,并尝试在捕获的SynchronizationContext上恢复异步方法。
它完全取决于SynchronizationContext发生了什么。有许多不同的可能性,完整的答案取决于您的GUI框架。

这也是我的推理,我期望执行会继续。然而,当我尝试在WP8上测试它时,它从嵌套的await调用中永远不会返回。 - David Božjak
2
嵌套的等待也会发布到捕获的上下文中,除非您使用了 ConfigureAwait(false)。似乎 WP8 不再执行回调,如果同步上下文被处理掉了,那么一切都会停止,您的等待将永远挂起。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接