2

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

4

2 回答 2

1

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

于 2012-07-25T09:04:07.413 回答
1

async/await应该可以正常工作。

每个 WPF 窗口都会创建自己的SynchronizationContext- 至少现在是这样(这是一个实现细节)。但这些只是 common 的简单包装Dispatcher

所以,TaskAwaiter最终会SynchronizationContext为一个被破坏的窗口捕获 a ,但这并不重要,因为Dispatcher它仍然在那里。

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

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

于 2012-07-25T15:20:23.490 回答