1

我正在尝试在我的 Windows Phone 8 应用程序中使用基于任务的异步模式。想法是所有长时间运行的操作都引用取消令牌,并且在应用程序中有一个存储所有这些令牌的地方。当应用程序接收Deactivated到事件时,它会遍历所有令牌并取消它们。

问题是具有长时间运行操作的线程未计划在应用程序停用时运行,这意味着如果我尝试CancellationToken.ThrowIfCancellationRequested();在该线程中使用,它只会在应用程序恢复时调用,而不是在应用程序停用时调用。当然,这不是我想要的。如果我正在做一个简单的技巧token.Register(() => Thread.Sleep(1000));,即暂停调用取消的线程片刻,那么第二个线程有机会运行,并且一切都像魅力一样被取消。然而,这是一个肮脏的黑客,我不想在我的应用程序中使用它。

问题是如何确保在操作取消完成时应用程序没有退出?我假设合作取消的标志是抛出 OperationCancelledException,但是如何等待它,特别是如果我只有对 CancellationTokenSource 的引用,而不是对 Task 对象的引用?有其他方法可以知道吗?

非常感谢提前!

PS如果您需要更多代码来帮助我,请问。

4

1 回答 1

0

我认为CancellationToken在您的情况下存储所有 s 还不够,您还需要存储相应Task的 s。在您的Deactivated处理程序中,您将取消所有标记,然后取消所有await存储Task的 s(捕获OperationCancelledExceptions)。(我不确定如何Deactivated使用async,您可能需要一些东西让系统知道您实际上还没有完成停用。)

于 2013-02-12T12:07:56.567 回答