在应用程序停用期间取消任务时的竞争条件

时间:2013-02-12 10:18:43

标签: c# exception windows-phone-8 async-await lifetime

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

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

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

提前多多谢谢!

P.S。如果您需要更多代码来帮助我,请询问。

1 个答案:

答案 0 :(得分:0)

我认为在你的情况下存储所有CancellationToken还不够,你还需要存储相应的Task。在Deactivated处理程序中,您将取消所有令牌,然后await取消所有存储的Task(捕获OperationCancelledException s)。 (我不确定Deactivatedasync的确如何一致,你可能需要一些东西让系统知道你还没有真正完成停用。)