假设我有一个 WPF 对话框,其中我有异步事件处理程序等待一些需要很长时间的调用。然后用户在等待返回之前关闭对话框(并且代码处理它)。我想这会导致崩溃。是否有规定的方法来使用 C# 5 中的新 async/await 关键字和 .NET 4.5 中的新 TaskAsync 方法来处理这种情况?
2 回答
我认为这取决于具体情况。如果您在 d 对象的async
方法中有代码Dispose()
,它可以继续正常运行,因为Dispose()
对框架没有任何意义。当然,如果该方法调用了一些会抛出ObjectDisposedException
(或一些其他异常)的方法,那将停止异步操作(除非您捕获到异常)。但这不会自动发生。
async
/await
应该可以正常工作。
每个 WPF 窗口都会创建自己的SynchronizationContext
- 至少现在是这样(这是一个实现细节)。但这些只是 common 的简单包装Dispatcher
。
所以,TaskAwaiter
最终会SynchronizationContext
为一个被破坏的窗口捕获 a ,但这并不重要,因为Dispatcher
它仍然在那里。
现在,您的代码所做的是另一回事。例如,如果您async
在这种情况下有一个事件处理程序,它必须能够处理已处置实例的恢复。
Adam 和 leppie 都有很好的评论:要么阻止用户关闭对话框,要么取消任务(并确保在实际关闭对话框之前取消它)。另一个不错的选择 - 如果您的想法是开始一个应该比对话框更持久的操作 - 是启动Task
然后将其添加到正在进行的操作的共享集合中。所有这些选项都可以防止async
事件处理程序在已处置的实例上运行的不良情况。