C# 如果等待电话没有';是否在处理调用方之前完成?

C# 如果等待电话没有';是否在处理调用方之前完成?,c#,async-await,C#,Async Await,想象一个场景,您有一种或另一种形式的控件。它可以是WP8上的一个页面,也可以是WinForms中的一个表单,我认为这无关紧要(或者说是真的?)。在某个时刻,您调用了wait on方法,但不久之后,用户关闭了控件get 您等待的任务会发生什么变化?它是否继续执行?如果它返回,它将返回到哪里?如果取消,是否引发异常 最后,是否有方法指定您希望继续/完成执行?任务继续执行。这不能是任何其他方式,因为运行代码只能协同中止(这里不考虑邪恶的线程.Abort) 任务对其环境一无所知。等待程序收到完成通知,并

想象一个场景,您有一种或另一种形式的控件。它可以是WP8上的一个页面,也可以是WinForms中的一个表单,我认为这无关紧要(或者说是真的?)。在某个时刻,您调用了wait on方法,但不久之后,用户关闭了控件get

您等待的任务会发生什么变化?它是否继续执行?如果它返回,它将返回到哪里?如果取消,是否引发异常


最后,是否有方法指定您希望继续/完成执行?

任务继续执行。这不能是任何其他方式,因为运行代码只能协同中止(这里不考虑邪恶的
线程.Abort

任务
对其环境一无所知。等待程序收到完成通知,并尝试在捕获的
SynchronizationContext
上恢复异步方法


这完全取决于同步上下文发生了什么。可能存在许多不同的上下文,完整的答案取决于您的GUI框架。

“调用者”是一个方法,而不是一个对象,因此我认为将其视为调用者被释放是没有意义的。(从技术上讲,该方法被转换为一个类,但即便如此,也不是这样处理的。)这也是我的推理,我希望执行会继续。但是,当我尝试在WP8上测试它时,它从不从嵌套的等待调用返回。嵌套的等待也会发送到捕获的上下文,除非您使用了
ConfigureAwait(false)
。如果同步上下文被释放,WP8似乎不再执行回调。然后,一切都停止了,你的等待永远挂起。