如果关联的UI被释放,C#中的异步等待代码会发生什么情况

如果关联的UI被释放,C#中的异步等待代码会发生什么情况,c#,asynchronous,task-parallel-library,C#,Asynchronous,Task Parallel Library,假设我有一个WPF对话框,其中有异步事件处理程序,等待一些需要很长时间的调用。然后,用户在等待返回之前关闭对话框(并由代码处理)。我想那会引起车祸。使用C#5中的新async/await关键字和.NET 4.5中的新TaskAsync方法是否有一种规定的方法来处理这种情况?我认为这取决于具体情况。如果在Dispose()d对象上的async方法中有代码,它可以正常继续,因为Dispose()对框架没有任何意义。当然,如果该方法调用将抛出ObjectDisposedException(或其他异常)

假设我有一个WPF对话框,其中有异步事件处理程序,等待一些需要很长时间的调用。然后,用户在等待返回之前关闭对话框(并由代码处理)。我想那会引起车祸。使用C#5中的新async/await关键字和.NET 4.5中的新TaskAsync方法是否有一种规定的方法来处理这种情况?

我认为这取决于具体情况。如果在
Dispose()
d对象上的
async
方法中有代码,它可以正常继续,因为
Dispose()
对框架没有任何意义。当然,如果该方法调用将抛出
ObjectDisposedException
(或其他异常)的某个方法,则将停止异步操作(除非捕获异常)。但是它不会自动发生。

异步
/
等待
应该可以正常工作

-至少现在(这是一个实施细节)。但这些只是普通
调度器的简单包装

因此,
TaskAwaiter
最终将为一个被破坏的窗口捕获一个
SynchronizationContext
,但这并不重要,因为
调度程序仍然存在

现在,您的代码所做的是另一个故事。e、 例如,在这种情况下,如果您有一个
async
事件处理程序,那么它必须能够处理已处理实例上的恢复


Adam和leppie都有很好的评论:要么阻止用户关闭对话框,要么取消任务(并确保在实际关闭对话框之前取消任务)。另一个好的选择——如果您的想法是启动一个应该比对话框持续时间更长的操作——是启动
任务
,然后将其添加到正在进行的操作的共享集合中。所有这些选项都可以防止
async
事件处理程序在已处置的实例上运行的不良情况。

不是对您问题的直接回答,但您是否考虑过阻止用户在操作完成之前关闭对话框?我不知道这与你的应用程序的用户体验有什么关系,这只是一个需要考虑的方向。也许这只是我见过的玩具演示,但似乎没有考虑到这个场景。我会调查取消的事。